【Go语言圣经】第三节:基础数据类型
三. 基础数据类型
Golang 将数据类型分为四类,分别是基础类型、复合类型、引用类型和接口类型。本章介绍基础类型,包括数字、字符串和布尔类型。复合数据类型包括数组和结构体、引用类型包括指针、切片、字典、函数和通道。
3.1 整型
Golang 同时提供了有符号和无符号类型的整数运算。有 int8、int16、int32 和 int64 四种截然不同大小的有符号整数类型,与此对应的是 uint8、uint16、uint32、uint64 四种无符号类型。
Unicode 字符 rune 类型是 int32 等价的类型。byte 是 uint8 类型的等价类型。
还有一种无符号整数类型 uintptr,它没有指定具体的 bit 大小,但是足以容纳指针。uintptr 只有在底层编程才被需要。
3.2 浮点数
Golang 提供了两种精度的浮点数,float32 和 float64。
3.3 复数
Golang 提供了两种精度的复数类型:complex64 和 complex128,分别对应 float32 和 float64 两种浮点数精度。内置的 complex 函数用于构建复数,内建的 real 和 imag 函数分别返回复数的实部和虚部:
var x complex128 = complex(1, 2) // 1 + 2i
var y complex128 = complex(3, 4) // 3 + 4i
fmt.Println(x * y)
fmt.Println(real(x * y)) // "-5"
fmt.Println(real(x * y)) // "10"
如果一个浮点数面值或一个十进制整数面值后跟着 i,则它将构成复数的虚部,其实部为零。同样,可以用自然的方式书写复数:
x := 1 + 2i
y := 3 + 4i
复数可以比较,当然是实部和虚部都相等的时候复数才相等。
3.4 布尔型
与常见语言的规则相同,此处不再赘述。
3.5 字符串
一个字符串是一个不可改变的字节序列。字符串可以包含任意的数据,包括 byte 值 0,但是通常是用来包含人类可读的文本。文本字符串通常被解释为采用 UTF8 编码的 Unicode 码点(rune)序列。
内置的 len 函数可以返回一个字符串中的字节数目(不如 rune 字符数目):
s := "Hello, World"
fmt.Println(len(s)) // 12
可以使用切片生成新的字符串:
fmt.Println(s[0:5]) // "hello"
可以使用+
将两个字符串拼接。可以使用==
和<
进行比较,比较规则是逐个字节完成比较。
因为字符串是不可修改的,因此尝试修改字符串内部数据的操作也是被禁止的:
s[0] = 'L' // compile error: cannot assign to s[0]
3.5.1 字符串面值
将一系列字节包含在双引号内几位字符串面值:
"Hello, World"
3.5.2 Unicode
3.5.3 UTF-8
3.5.4 字符串和 Byte 切片
标准库中有四个包对字符串处理尤为重要:bytes、strings、strconv 和 unicode 包。
3.5.5 字符串和数字的转换
strconv 包提供了字符串和数值之间转换的功能:
将一个整数转为字符串,一种方法是用 fmt.Sprintf
返回一个格式化的字符串,另一个方法是用 strconv.Itoa
。
x := 123
y := fmt.Sprintf("%d", x)
fmt.Println(y, strconv.Itoa(x)) // "123 123"
3.6 常量
常量表达式的值在编译器计算,而不是运行期。每个常量的潜在类型都是基础类型:boolean、string 或 数字。
一个常量的定义方法如下:
const pi = 3.14159
和变量的声明类似,可以同时声明多个常量:
const (
e = 1.2345
p = 6.7891
)
const (
a = 1
b
c = 2
d
)
fmt.Printf("%d %d %d %d", a, b, c, d) // 1, 1, 2, 2
所有常量的运算都会在编译器完成,减少了运行时的工作,也方便其他编译优化。
3.6.1 iota 常量生成器
常量声明可以使用 iota 常量生成器进行初始化,它用于生成一组以相似规则初始化的常量。在一个 const 声明语句中,在第一个声明的常量的所在行,iota 将会被置为 0,然后每一个有常量声明的行加一:
type Weekday int
const (
Sunday Weekday = iota // 0
Monday // 1
Tuesday // 2 ... ... ...
Wednesday
Thursday
Friday
Saturday
)
一个更复杂的例子如下:
const (
_ = 1 << (10 * iota)
KiB // 1024
MiB // 1048576
GiB // 1073741824
TiB // 1099511627776 (exceeds 1 << 32)
PiB // 1125899906842624
EiB // 1152921504606846976
ZiB // 1180591620717411303424 (exceeds 1 << 64)
YiB // 1208925819614629174706176
)
3.6.2 无类型常量
有六种未明确类型的常量类型,分别是无类型的布尔型、无类型的整数、无类型的字符、无类型的浮点数、无类型的复数、无类型的字符串。
例如 math.Pi
是无类型的浮点数常量,可以直接用于任意需要浮点数或复数的地方:
var x float32 = math.Pi
var y float64 = math.Pi
var z complex128 = math.Pi