Go中数值类型可细分为整数、浮点数、复数三种,每种都具有不同的大小范围和正负支持。
整数
整型分为两大类
- 按长度划分:int8、int16、int32、int64
- 按符号划分:uint8、uint16、uint32、uint64
Go整型 | 其它语言 |
---|---|
uint8 | byte |
int16 | short |
int64 | long |
Go提供了有符号和无符号的整数类型,同时提供四种大小不同的整数类型。
- 整数类型根据有无符号(符号位)可分为有符号整数和无符号的整数
- 整数类型根据二进制
bit
位大小分为8bit、16bit、32bit、64bit四种
取值范围
- 有符号整数采用2的补码形式表示,最高
bit
位表示符号位,因此取值范围从 -2^(n-1) 到 2^(n-1)-1。 - 无符号整数所有
bit
位都用于表示非负数,因此取值范围从 1 到 2^n-1。
等价类型
类型 | 等价类型 | 描述 |
---|---|---|
uint8 | byte |
byte 类型用于强调数值是一个原始的数据而非小整数,可用于存储单个字节。 |
int32 | rune | 表示Unicode 字符,一个Unicode码点。 |
特殊整型
int
和uint
分别对应特定CPU平台的字长(机器字大小),大小范围在32bit
或64bit
之间变化,实际开发中由于编译器和硬件不同而不同。
类型 | 描述 |
---|---|
uint | 32位操作系统上为uint32(4个字节),64位操作系统上为uint64(8个字节)。 |
int | 32位操作系统上为int32(4个字节),64位操作系统上为int64(8个字节)。 |
uintptr | 无符号整型,用于存放一个指针。 |
进制转换
- Golang中无法直接定义二进制数,只能通过进制转换来实现。
- Linux权限数字采用的是八进制数,比如0777、0666...
- 内存地址一般采用十六进制
var i = 10
fmt.Printf("binary i = %b\n", i) //1010
fmt.Printf("decimal i = %d\n", i) //10
fmt.Printf("octal i = %o\n", i) //12
fmt.Printf("hexadecimal i = %x\n", i) //a
fmt.Printf("hexadecimal i = %X\n", i) //A
fmt.Printf("type i = %T\n", i) //int
进制 | 名称 | 描述 |
---|---|---|
%b | binary | 二进制 |
%d | decimal | 十进制 |
%o | octal | 八进制 |
%x | hexadecimal | 十六进制 |
%T | type | 查看变量类型 |
转换函数
var x = 10
i := int8(x)
fmt.Printf("i = %d, type = %T\n", i, i) //i = 10, type = int8
使用注意
- 整型变量的零值为0,浮点型的零值为0.0。
- 整型中
int
是计算最快的一种类型 - 浮点型尽可能使用
float64
,因为math
数学包中有关数学运算的函数均采用此类型。 - Golang是强类型语言不会隐式转换,因此Golang禁止不同类型之间的混合使用,但允许常量之间的混合使用。
字节长度
-
unsafe.Sizeof(varname)
可获取变量占用的字节长度
var i uint16 = 1
fmt.Printf("i = %d, type = %T, size = %d\n", i, i, unsafe.Sizeof(i)) //i = 1, type = uint16, size = 2
浮点数
Golang提供了两种精度的浮点数分别为float32
和float64
,它们的算术规范由IEEE754浮点数国际标准定义,IEEE754浮点数标准被现代CPU支持。
-
float32
在内存分配中占用4字节用于存储,float64
内存中会分配8字节用于存储。
浮点数 = 符号位 + 指数位 + 尾数位
- 存储过程中,浮点数的尾数部分可能会丢失,因而会造成精度损失。
float32
类型的浮点数可提供约6个十进制数的精度,float64
类型的浮点数可提供约15个十进制数的精度。通常会优先选择使用float64
,因为float32
累计计算误差会比较容易扩散。
f := 3.14159
fmt.Printf("%T\n", f) //float64
f32 := float32(f)
fmt.Printf("%T\n", f32) //float32
- float32不能直接转换为float64
f = f32 // cannot use f32 (type float32) as type float64 in assignment
- 浮点数的极限值可使用
math
包中的math.MaxFloat32
和math.MaxFloat64
常量获取。
fmt.Println(math.MaxFloat32) //3.4028234663852886e+38
fmt.Println(math.MaxFloat64) //1.7976931348623157e+308
- 浮点数声明时可只写整数部分或小数部分,不可省略小数点。
- 较大或较小的浮点数可采用科学计数法通过
e
或E
来指定指数部分
- 格式化输出浮点数时使用
%f
来控制保留小数位数
复数
计算机中复数(complex)由两个浮点数表示,一个表示实部(real)一个表示虚部(imag)。
Go语言中复数的值由三部分组成RE + IMi
,分别是实数部分RE
、虚数部分IM
、虚数单位i
,RE
和IM
均为float
。
Go语言提供两种类型的复数,分别是complex64
即32位实数和虚数,complex128
即64位实数和虚数,complex128
为复数的默认类型。
复数声明
var z complex128 = complex(x, y)
z
表示复数的变量名,complex128
表示复数类型,complex()
内置函数用于为复数赋值。x
和y
分别表示构成该复数的两个float64
类型的值,x
为实部,y
为虚部。
简写形式
z := complex(x, y)
对于z
值可通过内置函数real(z)
获取该复数的实部,使用imag(z)
获取虚部。
网友评论