Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions src/essential/base/62.string.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
---
date: 2022-08-20
date: 2026-01-21
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

欢迎提交PR,我对其他修改没有异议,不过请不要修改date,它代表的是最初发布时间,每篇文章的最后更新时间和最后更新作者会通过git commit生成,显示在文章末尾

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

抱歉抱歉,是我对文档的了解不够,已还原时间。

---

# 字符串

在 Go 中,字符串本质上是一个不可变的只读的字节数组,也是一片连续的内存空间
在 Go 中,字符串本质上是一个不可变的、只读的字节序列(byte sequence),这里“字节序列”指的是字符串的底层数据由一串按顺序排列的字节组成,这些字节占用一片连续的内存空间

## 字面量

Expand Down Expand Up @@ -48,7 +48,7 @@ opqrst \uvwxyz

## 访问

因为字符串本质是字节数组,所以字符串的访问形式跟数组切片完全一致,例如访问字符串第一个元素
因为字符串本质是字节序列,其索引操作`str[i]`被设计为返回第 i 个字节,语法上与切片一致,例如访问字符串第一个元素

```go
func main() {
Expand All @@ -57,7 +57,7 @@ func main() {
}
```

输出是字节而不是字符
输出是字节编码值而不是字符

```
116
Expand Down Expand Up @@ -106,7 +106,7 @@ that is a string

## 转换

字符串可以转换为字节切片,而字节切片或字节数组也可以转换为字符串,例子如下:
字符串可以转换为字节切片,而字节切片或字节序列也可以转换为字符串,例子如下:

```go
func main() {
Expand Down Expand Up @@ -152,7 +152,7 @@ func main() {

## 长度

字符串的长度,其实并不是字面量的长度,而是字节数组的长度,只是大多数时候都是`ANSCII`字符,刚好能用一个字节表示,所以恰好与字面量长度相等,求字符串长度使用内置函数`len`,例子如下:
字符串的长度,其实并不是字符的个数,而是字节序列的长度。只是大多数时候我们处理的是 ASCII 字符,每个字符恰好能用一个字节表示,所以字节长度与字符个数恰好相等。求字符串长度使用内置函数`len`,例子如下:

```go
func main() {
Expand Down Expand Up @@ -180,7 +180,7 @@ func main() {

```
t // 字母t
è // 意大利语
è // 一个中文字符的“碎片”(第一个字节)的编码值,碰巧与意大利语字符 è 的编码值相同
这 // 中文汉字
```

Expand Down Expand Up @@ -308,7 +308,7 @@ func main() {
33,21,!
```

按照字节来遍历会把中文字符拆开,这显然会出现乱码。Go 字符串是明确支持 utf8 的,应对这种情况就需要用到`rune`类型,在使用`for range`进行遍历时,其默认的遍历单位类型就是一个`rune`,例如下方代码
按照字节来遍历会把中文字符拆开,这显然会出现乱码。Go 字符串是明确支持 UTF-8 的,应对这种情况就需要用到`rune`类型,在使用`for range`进行遍历时,其默认的遍历单位类型就是一个`rune`,例如下方代码

```go
func main() {
Expand All @@ -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() {
Expand All @@ -345,7 +345,7 @@ func main() {
}
```

还可以使用`uft8`包下的工具,例如
还可以使用`utf8`包下的工具,例如

```go
func main() {
Expand Down