手记

【学习打卡】第9天 深入Go底层原理,重写Redis中间件实战 第4章

课程名称:深入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])

0人推荐
随时随地看视频
慕课网APP