关于string:go的stringbyte和rune类型

8次阅读

共计 924 个字符,预计需要花费 3 分钟才能阅读完成。

rune 是 int32 的别名类型,一个值就代表一个 Unicode 字符。
byte 是 uint8 的别名类型,一个值就代表一个 ASCII 码的一个字符。
rune 类型的值在底层都是由一个 UTF-8 编码值来表白的。

理解下什么是 Unicode 字符和 ASCII 码:
1、简略了解,咱们平时接触到的中英日文,或者复合字符,都是 Unicode 字符。比方,’G’、’o’、’ 爱 ’、’ 好 ’、’ 者 ’ 就是一个个 Unicode 字符。
2、字符在计算机中存储时须要应用二进制数来示意。所以人们定义了一张表,将咱们用到的字符用一个二进制数值示意。这就是 ASCII 码表的由来。

UTF-8 编码方案会把一个 Unicode 字符编码为一个长度在 1\~4 以内的字节序列。所以,一个 rune 类型值代表了 1\~4 个长度的 byte 数组。

案例:

func main() {
    str := "Go 爱好者"
    fmt.Printf("The string: %q\n", str)
    fmt.Printf("=> runes(char): %q\n", []rune(str))
    fmt.Printf("=> runes(hex): %x\n", []rune(str))
    fmt.Printf("=> bytes(hex): [% x]\n", []byte(str))
}

The string: "Go 爱好者"
 => runes(char): ['G' 'o' '爱' '好' '者']
 => runes(hex): [47 6f 7231 597d 8005]
 => bytes(hex): [47 6f e7 88 b1 e5 a5 bd e8 80 85]

字符串值 ”Go 爱好者 ” 如果被转换为 []rune 类型的值的话,其中的每一个字符(不论是英文还是中文)就都会独立成为一个 rune 类型的元素值。如打印出的第二行内容。
又因为,每个 rune 类型的值在底层都是由一个 UTF-8 编码值来表白的,如第三行
把每个字符的 UTF-8 编码值都拆成相应的字节序列,如第四行,因为一个中文字符的 UTF-8 编码值须要用三个字节来表白。

总结:
一个 string 类型的值既能够被拆分为一个蕴含多个字符的序列,也能够被拆分为一个蕴含多个字节的序列。前者能够由一个以 rune 为元素类型的切片来示意,而后者则能够由一个以 byte 为元素类型的切片代表。

正文完
 0