课程名称:深入Go底层原理,重写Redis中间件实战
课程章节:数组,字符串,切片底层是一样的吗?
主讲老师:Moody
课程内容:
今天学习的内容包括:
字符串
Unicode字符集
UTF-8变长编码
字符串的访问
字符串的切分
课程收获:
字符串
- Go中的字符串在runtime下都转化为stringStruct的结构体。
- stringStruct由一个指针和int型的长度构成,因此unsafe.Sizeof(“xxx”)任意字符串都为16个字节。
- 实际的字符串数据是存储在一个字节数组中,通过stringStruct.str指针指向这个数组。
- stringStruct.len是字节长度,而不是字符长度。
// C:\Program Files\Go\src\runtime\string.go
type stringStruct struct {
str unsafe.Pointer
len int
}
Unicode字符集
- 一种统一的字符集
- 囊括了159种文字的144679个字符
- 14万个字符至少需要3个字节表示
UTF-8变长编码
- Unicode的一种变长格式
- 128个US-ASCII字符只需一个字节编码
- 西方常用字符需要两个字节
- 其他字符需要3个字节,极少需要4个字节
字符串的访问
- 对字符串使用len方法得到的是字节数不是字符数
- 对字符串直接使用下标访问,得到的是字节
- 字符串被range遍历时,被解码成rune类型的字符
- UTF-8编码解码算法位于runtime/utf8.go
字符串的切分
- 需要切分时:
- 转为rune数组
- 切片
- 转为string
- s = string([]rune(s)[:3])