Golang 基础之数据类型梳理
大家好,将梳理出的 Go语言数据类型内容,分享给大家。 请多多指教,谢谢。
类型汇总
Go 语言中,主要分为值类型主要分为三部分: 整型、浮点型和其他类型。
// 整型
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
// 浮点型、复数
float32 float64 complex128 complex64
// 其他类型
bool byte rune string error
整型
Go语言同时提供了有符号和无符号类型的整数运算。
int int8 int16 int32 有符合和无符号类型
这里有int8、int16、int32和int64四种截然不同大小的有符号整数类型,分别对应8、16、32、64bit大小的有符号整数,与此对应的是uint8、uint16、uint32和uint64四种无符号整数类型。
这里还有两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint;其中int是应用最广泛的数值类型。这两种类型都有同样的大小,32或64bit,但是我们不能对此做任何的假设;因为不同的编译器即使在相同的硬件平台上可能产生不同的大小。
uintptr 类型
uintptr 是一种无符号的整数类型 ,没有指定具体的bit大小但是足以容纳指针。uintptr 类型只有在底层编程时才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。
不管它们的具体大小,int、uint 和 uintptr 是不同类型的兄弟类型。其中int和int32也是不同的类型,即使int的大小也是32bit,在需要将int当作int32类型的地方需要一个显式的类型转换操作,反之亦然。
类型值范围
类型名称 | 大小 | 描述 |
---|---|---|
int | 8 字节 | int的大小是和操作系统位数相关的,如果是32位操作系统,int类型的大小是4字节;如果是64位操作系统,int类型的大小就是8个字节 |
int8 | 1 字节 | 无符号整数的所有bit位都用于表示非负数,值域是0到$2^n-1$。例如,int8类型整数的值域是从-128到127,而uint8类型整数的值域是从0到255。 |
int16 | 2 字节 | 有符号int16类型整数值域是从 -32768 ~ 32767,而无符号uint16类型整数值域是从 0 ~ 65535 |
int32 | 4 字节 | 有符号int32类型整数值域是从 -2147483648 ~ 2147483647,而无符号uint32类型整数值域是从 0 ~ 4294967295 |
int64 | 8 字节 | 有符号int64类型整数值域是从 -9223372036854775808 ~ 9223372036854775807,而无符号uint64类型整数值域是从 0 ~ 18446744073709551615 |
uintptr | 长度4或8字节 | 存储指针的uint32 或 uint64整数 |
取值范围示例
package main
import (
"fmt"
"math"
"unsafe"
)
func main() {
fmt.Println("各int类型的大小: ")
var i1 int = 1
var i2 int8 = 2
var i3 int16 = 3
var i4 int32 = 4
var i5 int64 = 5
var i6 uint64 = 6
fmt.Printf("int : %v\n", unsafe.Sizeof(i1))
fmt.Printf("int8 : %v\n", unsafe.Sizeof(i2))
fmt.Printf("int16 : %v\n", unsafe.Sizeof(i3))
fmt.Printf("int32 : %v\n", unsafe.Sizeof(i4))
fmt.Printf("int64 : %v\n", unsafe.Sizeof(i5))
fmt.Printf("uint64: %v\n", unsafe.Sizeof(i6))
// 输出各int类型的取值范围
fmt.Println("int8:", math.MinInt8, "~", math.MaxInt8)
fmt.Println("int16:", math.MinInt16, "~", math.MaxInt16)
fmt.Println("int32:", math.MinInt32, "~", math.MaxInt32)
fmt.Println("int64:", math.MinInt64, "~", math.MaxInt64)
fmt.Println()
// n是自动推导类型
n := 1234567890
fmt.Printf("n := 1234567890 的默认类型为: %T\n", n)
fmt.Printf("int类型的字节数为: %v\n\n", unsafe.Sizeof(n))
// 初始化一个32位整型值
var a int32 = 987654321
fmt.Println("var a int32 = 987654321")
// 输出变量的十六进制形式和十进制
fmt.Printf("int32: 十六进制为0x%x, 十进制为%d\n", a, a)
// 将a转换为int8类型, 发生数值截断
b := int8(a)
fmt.Printf("int8: 十六进制0x%x, 十进制为%d\n", b, b)
// 将a转换为int16类型, 发生数值截断
c := int16(a)
fmt.Printf("int16: 十六进制为0x%x, 十进制%d\n", c, c)
// 将a转换为int64类型
d := int64(a)
fmt.Printf("int64: 十六进制为0x%x, 十进制%d\n", d, d)
}
浮点型
浮点数类型的取值范围可以从很微小到很巨大。浮点数的范围极限值可以在math包找到。常量math.MaxFloat32表示float32能表示的最大数值,大约是 3.4e38
;对应的 math.MaxFloat64 常量大约是1.8e308
。它们分别能表示的最小值近似为1.4e-45
和4.9e-324
。
上述值,以科学计数法表示
列如:e38 就是小数点向右移动38位
e-35 就是小数点向左移动35位
float32、float64 类型
一个float32类型的浮点数可以提供大约6个十进制数的精度,而float64则可以提供约15个十进制数的精度;通常应该优先使用float64类型,因为float32类型的累计计算误差很容易扩散,并且float32能精确表示的正整数并不是很大(译注:因为float32的有效bit位只有23个,其它的bit位用于指数和符号;当整数大于23bit能表达的范围时,float32的表示将出现误差)
complex64、complex128 类型
Go语言提供了两种精度的复数类型:complex64 和 complex128,分别对应 float32 和 float64 两种浮点数精度。
实际上,complex64类型的值会由两个float32类型的值分别表示复数的实数部分和虚数部分。 complex128类型的值会由两个float64类型的值分别表示复数的实数部分和虚数部分。
复数类型的值一般由浮点数表示的实数部分、加号“+”、浮点数表示的虚数部分,以及小写字母“i”组成。比如, 3.7E+1 + 5.98E-2i
。正因为复数类型的值由两个浮点数类型值组成,所以其表示法的规则自然需遵从浮点数类型的值表示法的相关规则。
举例,内置的complex函数用于构建复数,内建的real和imag函数分别返回复数的实部和虚部:
var x complex128 = complex(1, 2)
类型值范围
类型名称 | 大小 | 描述 |
---|---|---|
float32 | 4 字节 | 单精度类型,占据4个字节byte,32个二进制位bit |
float64 | 8 字节 | 双精度类型比单精度类型更能精确地表示一个小数,但是占用的内存空间也比较大。 |
complex64 | 8 字节 | 包含两个float32类型表示复数 |
complex128 | 16 字节 | 包含两个float64类型表示复数 |
布尔型
介绍
布尔类型的值只有两种:true
和 false
。if和for语句的条件部分都是布尔类型的值,并且==和<等比较操作也会产生布尔型的值。一元操作符!
对应逻辑非操作,因此!true
的值为false
,更罗嗦的说法是(!true==false)==true
,虽然表达方式不一样,不过我们一般会采用简洁的布尔表达式,就像用x来表示x==true
。
使用
数字到布尔类型的转换
func itob(i int) bool {
return i != 0
}
rune 类型
介绍
rune 类型是和 int32 类型等价,在所有方面都等同于 int32
,按照约定,它用于区分字符值和整数值。
常用来处理 unicode 或 utf-8 字符,通常用于表示一个Unicode码点,这两个名称可以互换使用。
说的通俗一点就是
rune
一个值代表的就是一个Unicode
字符,它的最大特点就是可变长。它可以使用1 - 4
个字节表示一个字符,根据字符的不同变换长度。所以使用int32
类型范围就可以完美适配。 单个中文占 2 个字节,单个英文占 2 个字节。因为 Go 语言中字符串编码为
UTF-8
,英文占1
个字节,中文占3
个字节。 占用空间相比之下会更大
使用
计算中文字符
package main
import (
"fmt"
)
func main() {
var data = "帽儿山的枪手"
fmt.Println("data length", len(data))
fmt.Println("data word length", len([]rune(data)))
}
程序输出
data length 18
data word length 6
具体原因
len()
函数是用来获取字符串的字节长度在
utf-8
编码中,英文占1
个字节,中文占3
个字节
rune
一个值代表的就是一个Unicode
字符,所以求rune
切片的长度就是字符个数。
byte 类型
介绍
同样 byte也是uint8类型 的等价类型,byte类型一般用于强调数值是一个原始的数据而不是一个小的整数。
使用
字符串和字节slice之间可以相互转换
s := "abc"
b := []byte(s)
s2 := string(b)
string 类型
介绍
string 是 8 位字节的集合,通常但不一定代表UTF-8
编码的文本。string
可以为空,但不能为nil
。
字符串是一个不可改变的字节序列。 字符串可以包含任意的数据,包括byte值0, 但是通常是用来包含人类刻度的文本。文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列。
字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改字符串是由byte字节组成,所以字符串的长度是byte字节的长度。
Go语言源文件总是用UTF8编码, 并且Go语言的文本字符串也是以UTF8编码的方式处理,因此我们可以将Unicode码点也写到字符串面值中。
使用
拼接字符串:
package main
import (
"fmt"
)
func main(){
// %d 表示整形数字, %s 表示字符串
var stockcode int = 123
var enddate string = "2022-01-18"
var url string = "Code=%d&endDate=%s"
var target_url = fmt.Sprintf(url, stockcode, enddate)
fmt.Println(target_url)
}
error 类型
介绍
error 类型是 Go 语言的一种内置类型,使用的时候不用特定去import,它本质上是一个接口。
type error interface{
Error() string //Error()是每一个订制的error对象需要填充的错误消息,可以理解成是一个字段Error
}
使用
封装自定义错误类型
package main
import (
"fmt"
"errors"
)
type Error struct {
err error
}
func (e Error) MyError() string {
return e.err.Error()
}
func main() {
err := Error {
errors.New("test error"),
}
fmt.Println(err.MyError())
}
技术文章持续更新,请大家多多关注呀~~
搜索微信公众号【 帽儿山的枪手 】,关注我
Golang 基础之数据类型梳理的更多相关文章
- Golang 基础之基础语法梳理 (一)
大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第一章节 Golang 基础之基础语法梳理 (一) Gol ...
- Golang 基础之基础语法梳理 (二)
大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第二章节 Golang 基础之基础语法梳理 (一) Gol ...
- GoLang基础数据类型--->字典(map)详解
GoLang基础数据类型--->字典(map)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 可能大家刚刚接触Golang的小伙伴都会跟我一样,这个map是干嘛的,是 ...
- GoLang基础数据类型-切片(slice)详解
GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...
- GoLang基础数据类型--->数组(array)详解
GoLang基础数据类型--->数组(array)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang数组简介 数组是Go语言编程中最常用的数据结构之一.顾名 ...
- GoLang基础数据类型--->字符串处理大全
GoLang基础数据类型--->字符串处理大全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 欢迎加入: 高级运维工程师之路 59843264 ...
- Golang 基础之基础语法梳理 (三)
大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第三章节 Golang 基础之基础语法梳理 (一) Gol ...
- Golang基础之函数
golang基础之函数 1.为什么需要函数? 有些相同的代码可能出现多次,如果不进行封装,那么多次写入到程序中,会造成程序冗余,并且可读性降低 2.什么是函数 为完成某些特定功能的程序指令集合称为函数 ...
- Golang基础教程
以下使用goland的IDE演示,包含总计的golang基础功能共20个章节 一.go语言结构: 二.go基础语法: 三.变量 四.常量 五.运算符 六.条件语句 七.循环 八.函数 九.变量作用域 ...
- golang基础知识之encoding/json package
golang基础知识之json 简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.可以去json.org 查看json标准的清晰定义.json pack ...
随机推荐
- JDK安装及IDE安装编辑
1.下载及安装JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 环境变量的系统变量填上如下: 变量 ...
- 2025 CCPC打铁记
Day -? 报名参加 \(CCPC\) Day -1 周天比赛,周六签到. 早上依旧是在 \(lyyz\) 打练习赛. 中午 \(12:30\) 上车,结果教练忘了通知我,再加上我把北门认成南门,导 ...
- Java 把列表元素拼接字符串
摘要:使用 Java Collectors.joining等方法把List中的所有元素通过指定的分隔符拼接为字符串. 目录 综述 使用For循环 StringUtils.join 函数 Collect ...
- 通用jar包部署脚本
在<Linux下部署Spring Boot 项目 jar包>中,小编介绍了一步一步发布jar包的方法,这里提供一个通用Shell脚本,傻瓜式发布Spring Boot项目. 通过W ...
- Git镜像网站和Git网站提速方法
最近开始学习使用git,但是因为git是国外的网站,所以基本就是无法访问.如下图: 通过在网上查找资料,我发现了几个访问git的方法. 方法一.通过镜像网站 镜像网站一: https://github ...
- 使用 ftrace 跟踪内核丢包问题定位的实践
本文分享自天翼云开发者社区<使用 ftrace 跟踪内核丢包问题定位的实践>,作者:f****n 数据包的丢失可能会导致性能下降或服务中断.为了诊断内核中是否有丢包问题,我们可以使用 ft ...
- APIO2025 一堆题解
APIO2025 一堆题解 图论 AtCoder Xmas Contest 2024 A 答案永远是\(1\),6 NWRRC 2015 Graph 考虑不加边,怎么找字典序最小的拓扑序,就维护一个小 ...
- 🔥《刚刚问世》系列初窥篇-Java+Playwright自动化测试-19- 操作鼠标悬停(详细教程)
1.简介 在实际工作中,我们往往会遇到有些测试场景或者事件,playwright根本就没有直接提供方法去操作,而且也不可能面面俱到地把各种测试场景都全面覆盖提供方法去操作,这个时候就需要我们去掌握一些 ...
- Java8 Stream 中 Collectors 的操作
Collectors是java.util.stream包下的一个工具类,其中各个方法的返回值可以作为java.util.stream.Stream#collect的入参,实现对队列的各种操作,包括:分 ...
- 【闲话 No.3】 并查集相关
命に嫌われている. 小唐话 感觉有的时候已经无法与人正常交流,净做唐事.说些唐话了.或许是我无法准确猜到别人喜欢什么吧. 不过还是自己心底一点 joker 之心/私心作祟吧. 感觉我有时做的唐事真的挺 ...