11---
2- date : 2022-08-20
2+ date : 2026-01-21
33---
44
55# 字符串
66
7- 在 Go 中,字符串本质上是一个不可变的只读的字节数组,也是一片连续的内存空间 。
7+ 在 Go 中,字符串本质上是一个不可变的、只读的字节序列(byte sequence),这里“字节序列”指的是字符串的底层数据由一串按顺序排列的字节组成,这些字节占用一片连续的内存空间 。
88
99## 字面量
1010
@@ -48,7 +48,7 @@ opqrst \uvwxyz
4848
4949## 访问
5050
51- 因为字符串本质是字节数组,所以字符串的访问形式跟数组切片完全一致 ,例如访问字符串第一个元素
51+ 因为字符串本质是字节序列,其索引操作 ` str[i] ` 被设计为返回第 i 个字节,语法上与切片一致 ,例如访问字符串第一个元素
5252
5353``` go
5454func main () {
@@ -57,7 +57,7 @@ func main() {
5757}
5858```
5959
60- 输出是字节而不是字符
60+ 输出是字节编码值而不是字符
6161
6262```
6363116
@@ -106,7 +106,7 @@ that is a string
106106
107107## 转换
108108
109- 字符串可以转换为字节切片,而字节切片或字节数组也可以转换为字符串 ,例子如下:
109+ 字符串可以转换为字节切片,而字节切片或字节序列也可以转换为字符串 ,例子如下:
110110
111111``` go
112112func main () {
@@ -152,7 +152,7 @@ func main() {
152152
153153## 长度
154154
155- 字符串的长度,其实并不是字面量的长度,而是字节数组的长度,只是大多数时候都是 ` ANSCII ` 字符,刚好能用一个字节表示,所以恰好与字面量长度相等, 求字符串长度使用内置函数` len ` ,例子如下:
155+ 字符串的长度,其实并不是字符的个数,而是字节序列的长度。只是大多数时候我们处理的是 ASCII 字符,每个字符恰好能用一个字节表示,所以字节长度与字符个数恰好相等。 求字符串长度使用内置函数` len ` ,例子如下:
156156
157157``` go
158158func main () {
@@ -180,7 +180,7 @@ func main() {
180180
181181```
182182t // 字母t
183- è // 意大利语
183+ è // 一个中文字符的“碎片”(第一个字节)的编码值,碰巧与意大利语字符 è 的编码值相同
184184这 // 中文汉字
185185```
186186
@@ -308,7 +308,7 @@ func main() {
30830833,21,!
309309```
310310
311- 按照字节来遍历会把中文字符拆开,这显然会出现乱码。Go 字符串是明确支持 utf8 的,应对这种情况就需要用到` rune ` 类型,在使用` for range ` 进行遍历时,其默认的遍历单位类型就是一个` rune ` ,例如下方代码
311+ 按照字节来遍历会把中文字符拆开,这显然会出现乱码。Go 字符串是明确支持 UTF-8 的,应对这种情况就需要用到` rune ` 类型,在使用` for range ` 进行遍历时,其默认的遍历单位类型就是一个` rune ` ,例如下方代码
312312
313313``` go
314314func main () {
@@ -333,7 +333,7 @@ func main() {
33333333,21,!
334334```
335335
336- ` rune ` 本质上是` int32 ` 的类型别名,unicode 字符集的范围位于 0x0000 - 0x10FFFF 之间,最大也只有三个字节,合法的 UTF8 编码最大字节数只有 4 个字节,所以使用` int32 ` 来存储是理所当然,上述例子中将字符串转换成` []rune ` 再遍历也是一样的道理,如下
336+ ` rune ` 本质上是` int32 ` 的类型别名,unicode 字符集的范围位于 0x0000 - 0x10FFFF 之间,最大也只有三个字节,合法的 UTF-8 编码最大字节数只有 4 个字节,所以使用` int32 ` 来存储是理所当然,上述例子中将字符串转换成` []rune ` 再遍历也是一样的道理,如下
337337
338338``` go
339339func main () {
@@ -345,7 +345,7 @@ func main() {
345345}
346346```
347347
348- 还可以使用` uft8 ` 包下的工具,例如
348+ 还可以使用` utf8 ` 包下的工具,例如
349349
350350``` go
351351func main () {
0 commit comments