diff --git a/src/essential/base/62.string.md b/src/essential/base/62.string.md index 0ea6e3035..582c24c77 100644 --- a/src/essential/base/62.string.md +++ b/src/essential/base/62.string.md @@ -4,7 +4,7 @@ date: 2022-08-20 # 字符串 -在 Go 中,字符串本质上是一个不可变的只读的字节数组,也是一片连续的内存空间。 +在 Go 中,字符串本质上是一个不可变的、只读的字节序列(byte sequence),这里“字节序列”指的是字符串的底层数据由一串按顺序排列的字节组成,这些字节占用一片连续的内存空间。 ## 字面量 @@ -48,7 +48,7 @@ opqrst \uvwxyz ## 访问 -因为字符串本质是字节数组,所以字符串的访问形式跟数组切片完全一致,例如访问字符串第一个元素 +因为字符串本质是字节序列,其索引操作`str[i]`被设计为返回第 i 个字节,语法上与切片一致,例如访问字符串第一个元素 ```go func main() { @@ -57,7 +57,7 @@ func main() { } ``` -输出是字节而不是字符 +输出是字节编码值而不是字符 ``` 116 @@ -106,7 +106,7 @@ that is a string ## 转换 -字符串可以转换为字节切片,而字节切片或字节数组也可以转换为字符串,例子如下: +字符串可以转换为字节切片,而字节切片或字节序列也可以转换为字符串,例子如下: ```go func main() { @@ -152,7 +152,7 @@ func main() { ## 长度 -字符串的长度,其实并不是字面量的长度,而是字节数组的长度,只是大多数时候都是`ANSCII`字符,刚好能用一个字节表示,所以恰好与字面量长度相等,求字符串长度使用内置函数`len`,例子如下: +字符串的长度,其实并不是字符的个数,而是字节序列的长度。只是大多数时候我们处理的是 ASCII 字符,每个字符恰好能用一个字节表示,所以字节长度与字符个数恰好相等。求字符串长度使用内置函数`len`,例子如下: ```go func main() { @@ -180,7 +180,7 @@ func main() { ``` t // 字母t -è // 意大利语 +è // 一个中文字符的“碎片”(第一个字节)的编码值,碰巧与意大利语字符 è 的编码值相同 这 // 中文汉字 ``` @@ -308,7 +308,7 @@ func main() { 33,21,! ``` -按照字节来遍历会把中文字符拆开,这显然会出现乱码。Go 字符串是明确支持 utf8 的,应对这种情况就需要用到`rune`类型,在使用`for range`进行遍历时,其默认的遍历单位类型就是一个`rune`,例如下方代码 +按照字节来遍历会把中文字符拆开,这显然会出现乱码。Go 字符串是明确支持 UTF-8 的,应对这种情况就需要用到`rune`类型,在使用`for range`进行遍历时,其默认的遍历单位类型就是一个`rune`,例如下方代码 ```go func main() { @@ -333,7 +333,7 @@ func main() { 33,21,! ``` -`rune`本质上是`int32`的类型别名,unicode 字符集的范围位于 0x0000 - 0x10FFFF 之间,最大也只有三个字节,合法的 UTF8 编码最大字节数只有 4 个字节,所以使用`int32`来存储是理所当然,上述例子中将字符串转换成`[]rune`再遍历也是一样的道理,如下 +`rune`本质上是`int32`的类型别名,unicode 字符集的范围位于 0x0000 - 0x10FFFF 之间,最大也只有三个字节,合法的 UTF-8 编码最大字节数只有 4 个字节,所以使用`int32`来存储是理所当然,上述例子中将字符串转换成`[]rune`再遍历也是一样的道理,如下 ```go func main() { @@ -345,7 +345,7 @@ func main() { } ``` -还可以使用`uft8`包下的工具,例如 +还可以使用`utf8`包下的工具,例如 ```go func main() {