为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Go

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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消