Go 语言中的字符、代码点、符文和字节¶
统一码联盟(Unicode Consortium)把名为代码点的一系列数值赋值给了上百万个独一无二的字符。
例如,
大写字母 A 的代码点为 65 ,
而笑脸表情😁的代码点则为 128515 。
Go 语言提供了 rune(符文)类型用于表示单个统一码代码点,
该类型是 int32 类型的别名。
除此之外,
Go 语言还提供了 uint8 类型的别名 byte ,
这种类型既可以表示二进制数据,
又可以表示由美国信息交换标准代码(ASCII)定义的英文字符
(历史悠久的 ASCII 包含 128 个字符,它是统一码的子集)。
正如代码清单 9-4 所示,
byte 和 rune 跟它们为之创建别名的整数类型具有完全相同的表现。
代码清单 9-4 rune 和 byte : rune.go
var pi rune = 960
var alpha rune = 940
var omega rune = 969
var bang byte = 33
fmt.Printf("%v %v %v %v\n", pi, alpha, omega, bang) // 打印出“96094096933”
为了打印出字符而不是数字值本身,
我们可以在 Printf 中使用格式化变量 %c 而不是 %v :
fmt.Printf("%c%c%c%c\n", pi, alpha, omega, bang) // 打印出“πάω!”
Tip
虽然任意一种整数类型都可以使用格式化变量 %c ,
但是通过使用别名 rune ,
表明数字 960 代表字符而不是数字。
为了免除用户记忆统一码代码点的烦恼,
Go 提供了相应的字符字面量句法。
用户只需要像 'A' 这样使用单引号将字符包围起来,
就可以取得该字符的代码点。
如果用户声明了一个字符变量却没有为其指定类型,
那么 Go 将推断该变量的类型为 rune ,
因此以下 3 行代码将是等效的:
grade := 'A'
var grade = 'A'
var grade rune = 'A'
虽然 rune 类型代表的是一个字符,
但它实际存储的仍然是数字值,
因此 grade 变量存储的仍然是大写字母 'A' 的代码点,
也就是数字 65 。
除 rune 之外,
字符字面量也可以搭配别名 byte 一同使用:
var star byte = '*'
