![Go语言底层原理剖析](https://wfqqreader-1252317822.image.myqcloud.com/cover/131/40795131/b_40795131.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
5.2 符文类型
Go语言的设计者认为[1],用字符(character)表示字符串的组成元素可能产生歧义,因为有些字符非常相似,例如小写拉丁字母a与带重音符号的à。这些相似的字符真正的区别在于其编码后的整数是不相同的,a被表示为0x61,à被表示为0xE0。因此在Go语言中使用符文(rune)类型来表示和区分字符串中的“字符”,rune其实是int32的别称。
当用range轮询字符串时,轮询的不再是单字节,而是具体的rune。如下所示,对字符串b进行轮询,其第一个参数index代表每个rune的字节偏移量,而runeValue为int32,代表符文数。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_74_3.jpg?sign=1739253465-hKHSfnWTjFA4W7BdzPEFxtOuxlbXHFux-0-049085129812cf4638a9d3ad82617f89)
fmt.Printf有一个特殊的格式化符#U可用于打印符文数十六进制的Unicode编码方式及字符形状。如上例打印出:
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_74_4.jpg?sign=1739253465-6bNLSEhIeswZcbEKAJSklJF6qagofIcP-0-6392596e99e8aed42386fa6c1aa31ac8)
Go的标准库unicode/utf8为解释UTF-8文本提供了强大的支持,包含了验证、分离、组合UTF-8字符的功能。例如DecodeRuneInString函数返回当前字节之后的符文数及实际的字节长度。上面的for range样例可以改写为如下形式:
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_75_1.jpg?sign=1739253465-HKKcwsmfMYbg2hmW7h4xDt4GTKfOsJyp-0-cc4d1d92fe22b70e4f7718dfb72d2431)