基础数据类型
整型
有符号:int8、int16、int32、int64
无符号:uint8、uint16、uint32、uint64
此外还有两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint
上述类型最大值和最小值可以在math包找到,例如常量math.MaxUint64表示uint64的最大值。
- Unicode字符rune类型是和int32等价的类型,通常用于表示一个Unicode码点。
- byte是uint8类型的等价类型。
- 还有一种无符号的整数类型uintptr,没有指定具体的bit大小但是足以容纳指针。
浮点数
float32、float64
一个float32类型的浮点数可以提供大约6个十进制数的精度,而float64则可以提供约15个十进制数的精度。通常应该优先使用float64类型,因为float32类型的累计计算误差很容易扩散,并且float32能精确表示的正整数并不是很大。
浮点数的最大值可以在math包找到
复数
complex64、complex128:分别对应float32和float64两种浮点数精度。
内建的real和imag函数分别返回复数的实部和虚部:
var x complex128 = complex(1, 2) // 1+2i
var y complex128 = complex(3, 4) // 3+4i
fmt.Println(x*y) // "(-5+10i)"
fmt.Println(real(x*y)) // "-5"
fmt.Println(imag(x*y)) // "10"
字符串
一个字符串是一个不可改变的字节序列。文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列。
获取字节数目(不是rune字符数目)
s := "hello, world"
fmt.Println(len(s)) // "12"
获取切片
fmt.Println(s[0:11]) // "hello, world"
fmt.Println(s[:5]) // "hello"
fmt.Println(s[7:]) // "world"
fmt.Println(s[:]) // "hello, world"
下标访问
从0开始,如果试图访问超出字符串索引范围的字节将会导致panic异常
c := s[len(s)] // panic: index out of range
"+"拼接
s := "left foot"
t := s
s += ", right foot"
这并不会导致原始的字符串值被改变,但是变量s将因为+=语句持有一个新的字符串值,但是t依然是包含原先的字符串值。
fmt.Println(s) // "left foot, right foot"
fmt.Println(t) // "left foot
原生字符串面值
使用反引号代替双引号。没有转义操作,全部的内容都是字面的意思,包含退格和换行,因此一个程序中的原生字符串面值可能跨越多行。
唯一的特殊处理是会删除回车以保证在所有平台上的值都是一样的,包括那些把回车也放入文本文件的系统。
原生字符串面值用于编写正则表达式会很方便,因为正则表达式往往会包含很多反斜杠。原生字符串面值同时被广泛应用于HTML模板、JSON面值、命令行提示信息以及那些需要扩展到多行的场景。
const GoUsage = `Go is a tool for managing Go source code.
Usage:
go command [arguments]
...`
Unicode
是国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码。 Unicode码点对应Go语言中的rune整数类型。
将Unicode码点写到字符串面值
\uhhhh对应16bit的码点值
\Uhhhhhhhh对应32bit的码点值
其中h是一个十六进制数字;一般很少需要使用32bit的形式。每一个对应码点的UTF8编码。例如:下面的字母串面值都表示相同的值:
"世界"
"\u4e16\u754c"
"\U00004e16\U0000754c"
UTF8
是一个将Unicode码点编码为字节序列的变长编码。
Go语言源文件总是用UTF8编码,并且Go语言的文本字符串也以UTF8编码的方式处理。
布尔型
一个布尔类型的值只有两种:true和false
常量
const pi = 3.14159 // approximately; math.Pi is a better approximatio