Go 的 rune byte 和 string

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

- `rune` 、 `byte` 和 `string` 都是 `Go` 的内置类型 ----- - `byte` - byte是`uint8`的别名,在所有方面都等同于`uint8` - 按惯例,它用于区分**字节值**和**8位无符号整数值**。 - `rune` - `rune`是`int32`的别名,在所有方面都等同于`int32` - 按惯例,它用于区分**字符值**和**整数值**。 - `string` - string是所有**8位字节字符串**的集合,通常但不一定代表UTF-8编码的文本 - 字符串可能为空,但是不能为 `nil` - 字符串类型的值是不可变的 - 由上面得解释我们大概可以明白 - `rune` 可以表示得比 `byte` 多 - `string` 类型的底层是一个`byte` 数组 - 以上解释都来此 `Go` 源码注释 - 刚刚上面标注了**字节**和**字符**,现在我们来梳理字符和字节的概念 ----- - 存储单位 **字节** - 计算机存储信息的最小单位,称之为**位** `bit`,二进制的一个`0`或`1`叫一位 - 计算机存储容量基本单位是**字节** `Byte`,8个**二进制位**组成 `1` 个字节 - 信息表示单位 **字符** - **字符** 是一种符号,像 英文`a`和中文`阿` 就是不同字符 - 不同的字符在不同的编码格式下,所需要的存储单位不一样 - `ASCLII` 编码中一个**英文字母一字节**,一个**汉字两字节** - `UTF-8` 编码中 一个**英文字母一字节**,一个**常见汉字3字节**,不常用的超大字符集汉字4字节 ----- - `Go` 源码文件默认采用`Unicode`字符集,`Unicode`码点和内存中字节序列的变换实现使用了`UTF-8`,这使得`Go`编程无需考虑编码转换的问题非常方便 - 从编码上来分析 - `byte`用来强调一个字节代表的数据(例如字符 `a` 就是 `97`),而不是数字; - `rune`用来表示`Unicode`的码点,即一个字符 - 通俗一点 - `byte` 只能操作简单的字符,不支持中文操作 - `rune` 能操作任何字符 - 代码演示 ```go package main import "fmt" func main() { str := "hello 世界!" fmt.Println(str) fmt.Println(len(str)) fmt.Println(str[1]) fmt.Println(string(str[1])) fmt.Println(str[1:]) fmt.Println(str[7:]) } ************************************* 输出 hello 世界! 13 101 e ello 世界! ��界! ``` - 会输出 `hello 世界!`,这证明 `Go` 是`UTF-8` 编码的,输出长度为 `13` 这说明了一个汉字3字节 - 输出 `ello 世界!` 说明 `string` 底层的数据结构是数组 - 输出 `��界!` 说明 `string` 底层是一个`byte` 数组,不然不会乱码 ```go package main import "fmt" func StrChangeByRune(str *string, i int, ch rune) { temp := []rune(*str) temp[i] = ch *str = string(temp) } func StrChangeByByte(str *string, i int, ch byte) { temp := []byte(*str) temp[i] = ch *str = string(temp) } func main() { str := "你好 hello" str1 := "你好 hello" StrChangeByRune(&str, 1, 'A') StrChangeByByte(&str1, 1, 'A') fmt.Println(str) fmt.Println(str1) } ******************************* 输出 你A hello �A�好 hello ``` - 由输出 `你A hello` 和 `�A�好 hello` 可以看出 - `byte` 的操作单位是一个字节,可以理解为一个英文字符 - `rune` 的操作单位是一个字符,不管这个字符是什么字符

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

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

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