数值类型
整数类型
整数类型有无符号(如int)和带符号(如uint)两种,这两种类型的长度相同,但具体长度取决于不同编译器的实现。
int8、int16、int32和int64四种有符号整数类型,分别对应8、16、32、64bit大小的有符号整数,同样uint8、uint16、uint32和uint64对应四种无符号整数类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 有符号类型:
int 32位系统占据4个字节(范围和int32一样),64位系统占据8个字节(范围和int64一样)
int8 占据1字节 范围 -128 ~ 127
int16 占据2字节 范围 -2(15次方) ~ 2(15次方)-1
int32 占据4字节 范围 -2(31次方) ~ 2(31次方)-1
int64 占据8字节 范围 -2(63次方) ~ 2(63次方)-1
rune int32的别称
# 无符号类型:
uint 32位系统占据4个字节(范围和uint32一样),64位系统占据8个字节(范围和uint64一样)
uint8 占据1字节 范围 0 ~ 255
uint16 占据2字节 范围 0 ~ 2(16次方)-1
uint32 占据4字节 范围 0 ~ 2(32次方)-1
uint64 占据8字节 范围 0 ~ 2(64次方)-1
byte uint8的别称
注意: - 上述类型的变量之间不允许互相赋值或操作,且int的长度是32 bit, 但int 与 int32并不可以互用。 - Go默认的整型类型是int - 查看数据所占据的字节数方法:unsafe.Sizeof()
浮点类型
浮点类型的分类: 1
2float32 单精度 占据4字节 范围 -3.403E38 ~ 3.403E38 (math.MaxFloat32)
float64 双精度 占据8字节 范围 -1.798E208 ~ 1.798E308 (math.MaxFloat64)
由上看出: - 浮点数是有符号的,浮点数在机器中存放形式是:浮点数=符号位+指数位+尾数位
- 浮点型的范围是固定的,不受操作系统限制 - .512
这样数可以识别为 0.512
- 科学计数法:5.1234e2 = 5.12 * 10 的 2 次方 5.12E-2 = 5.12/10 的 2 次方
精度损失:float32可以提供大约6个十进制数的精度,float64大约可以提供15个十进制的精度(一般选择float64) 1
2
3
4var num1 float32 = -123.0000901
var num2 float64 = -123.0000901
fmt.Println("num1=",num1) //-123.00009
fmt.Println("num2=",num2) //-123.0000901
使用 == 号判断浮点数,是不可行的,替代方案如下: 1
2
3func isEqual(f1,f2,p float64) bool {
return math.Abs(f1-f2) < p //p为用户自定义精度,如:0.00001
}
go中的NaN
非数: 1
2var z float64
fmt.Println(z, -z, 1/z, -1/z, z/z) // "0 -0 +Inf -Inf NaN"
1
2nan := math.NaN()
fmt.Println(nan == nan, nan < nan, nan > nan) // "false false false"
复数
Go还支持复数。它的默认类型是complex128(64位实数+64位虚数)。如果需要小一些的,也有complex64(32位实数+32位虚数)。复数的形式为RE + IMi,其中RE是实数部分,IM是虚数部分,而最后的i是虚数单位。 如下所示: 1
2
3
4
5var t complex128
t = 2.1 + 3.14i
t1 = complex(2.1,3.14) //结果同上
fmt.Println(real(t)) //实部:2.1
fmt.Println(imag(t)) //虚部:3.14