3

go的string,byte和rune类型

 3 years ago
source link: https://studygolang.com/articles/33426
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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为元素类型的切片代表。

um6V3eN.png!mobile

有疑问加站长微信联系(非本文作者)

eUjI7rn.png!mobile

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK