go的string,byte和rune类型

煮酒 · · 908 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

image


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

本文来自:Segmentfault

感谢作者:煮酒

查看原文:go的string,byte和rune类型

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

908 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传