整数
与其他程序设计语言一样,Go的整型也分为有符号整型和无符号整型两类。有符号整型有int、int8、int16、int32、int64;无符号整型有uint、uint8、uint16、uint32、uint64、uintptr。上述整型中,后面带数字的整型有明确的大小,数字即代表比特位。int、uint、uintptr的大小并不明确,或者说与编译器相关。uintptr足以完整存放指针,仅用于底层编程,例如在Go程序与C程序库或操作系统的接口层。int、uint在特定平台上与原生的有符号整数/无符号整数相同,或等于该平台上的运算效率最高的值。
此外,rune类型是int32的同义词,常常用于指明一个值是Unicode码点(code point)。同样,byte类型是int8的同义词,强调一个值是原始数据,而非量值。
浮点数
Go有两种大小的浮点数:float32和float64,其算术特性遵从IEEE754标准。十进制下,float32的有效数字大约是6位,float64的有效数字大约是15位。通常情况下应优先选用float64,因为浮点数在计算机中的表示特点决定了浮点数运算存在误差,float32能精确表示的范围有限。
浮点数可以通过Printf的谓词%g输出,该谓词会自动保持足够的精度,并选择最简洁的表示方式。也可以使用%e(有指数)或%f(无指数)来进行特定表示。与C语言相同,这三个谓词都能指定输出宽度和数值精度。
复数
Go有两种大小的复数:complex64和complex128,二者分别由float32和float64构成。内置的complex函数根据给定的实部和虚部创建复数,而内置的real函数和imag函数则分别提取复数的实部和虚部。
var x complex128 = complex(1, 2) //1+2i
fmt.Println(x, real(x), imag(x)) //输出结果为 (1+2i) 1 2
布尔型
布尔型的变量只有两种可能的值:true和false。与C/C++不同的是,Go语言的布尔值无法隐式转换为整数,反之而已不行。因此如果转换操作经常用到,就需要自行实现转换函数。
func btoi(b bool) int {
if b {
return 1
}
return 0
}
func itob (i int) bool {
return i != 0
}
字符串
C/C++中字符串是一种由字符型(char)组成的复合类型,而在Go中的字符串是一种基本数据类型。
字符串是不可变的字节序列,它可以包含任意数据,包括0值字节。内置的len函数返回字符串的字节数而非字符数。Go原生支持Unicode字符(UTF-8),而一个UTF-8字符可能占1~4个字节,因此字符串的第i个字节不一定就是第i个字符。
s := "Hello,世界"
fmt.Println(len(s)) //len函数的返回值为12而非8
尽管可以将新值赋值给字符串类型的变量,但字符串值无法改变:字符串值是一个字面值常量,字节序列永不可变。这意味着两个字符串能安全地共用同一段底层内存,使得复制任何长度字符串的开销都比较低。如下例所示的字符串s及其子串共用一部分内存:
s := "Hello World"
t := s[:5]
本文部分内容摘自《Go程序设计语言》