From e08c49264f761e78e2e58df6a52fa6c18b16a6ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E7=BB=99=E5=9B=BD=E5=AE=B6=E6=8B=96=E5=90=8E?= =?UTF-8?q?=E8=85=BF?= <2202084770@qq.com> Date: Wed, 21 Jan 2026 02:41:56 +0800 Subject: [PATCH 1/2] docs: update string types --- src/essential/base/62.string.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/essential/base/62.string.md b/src/essential/base/62.string.md index 0ea6e3035..a368da946 100644 --- a/src/essential/base/62.string.md +++ b/src/essential/base/62.string.md @@ -1,10 +1,10 @@ --- -date: 2022-08-20 +date: 2026-01-21 --- # 字符串 -在 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() { From cec01c4e48f940c73eb3a24a01f1996326227c46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E7=BB=99=E5=9B=BD=E5=AE=B6=E6=8B=96=E5=90=8E?= =?UTF-8?q?=E8=85=BF?= <2202084770@qq.com> Date: Wed, 21 Jan 2026 23:31:47 +0800 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20=E8=BF=98=E5=8E=9F=E6=9C=80?= =?UTF-8?q?=E5=88=9D=E5=8F=91=E5=B8=83=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/essential/base/62.string.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/essential/base/62.string.md b/src/essential/base/62.string.md index a368da946..582c24c77 100644 --- a/src/essential/base/62.string.md +++ b/src/essential/base/62.string.md @@ -1,5 +1,5 @@ --- -date: 2026-01-21 +date: 2022-08-20 --- # 字符串