前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >go-slice和redis的sds

go-slice和redis的sds

原创
作者头像
爱学习的羊羊
修改2025-03-27 16:02:57
修改2025-03-27 16:02:57
620
举报

go- slice

可变长数组,引用类型,实际上就是结构体内封装了一个数组指针,作为参数传递,传的也是slice的对象,故可修改数组已有内容,追加内容后不生效,是因为slice内部的len是值传递,无法修改

结构

  • array指向一个数组地址
  • len slice当前的元素数量
  • cap slice容量,cap大于len,当需要增加元素时可以避免提前扩容

追加元素

  • 比如数组s1:=[]int{1,2,3,4,5,6,7,8},slice此时s1的len=8, cap=8
  • 执行命令s1=append(s1, 9),执行完len=9, cap=16,这个过程中发生了扩容,也就是给s1重新分配了一个容量为16地址, 再将原来的元素全部拷贝到新的地址
  • 再执行命令s1=append(s1,10),执行完len=10,cap=16, 这个时候由于还有多余的容量,故不需要分配新的内存地址

命令

s1:=[]int{1,2,3,4,5,6,7,8}

  • slow:high:maxlow:high) 指索引取值范围
    • s2 := s11:3:6, s2 = []int{2,3} cap = 5 ,此时s2指向s1的第二个元素的地址
    • s3 := s10:3:8, s3 = []int{1,2,3} cap = 8,此时s2指向s1的第二个元素的地址

与数组的差异

  • 数组固定长度, 比如 a1 := 2int, 而slice是可变长数组, slice底层array就是指向数组地址,可变长是依赖底层的底层的重新分配地址迁移完成的

redis-sds

扩容方便且二进制安全的字符串

结构

  • 按字符串长短区分类型(对于字符串长度的不同,可以定义不同大小的标记来存储长度,容量等)
  • 存储字符长度小于32的短字符串
    * flag的高5位存储长度 即 2的5次方-1,故可以存储的最长字符串小于32
  • 存储字符长度大于等于32的字符串
    len: 数组的长度,不同类型的len的类型不同 alloc: 总长度,不同类型的alloc的类型不同 _flags: 低3位存储字符串类型_undefined __ buf: 真正存储字符串的数组

redis的sds和go的slice区别

  • 共同点
    • 都存储了元素长度和容量
    • 都会在buf内存不足时分配新的更大的内存
    • 都采用预分配策略,预留一定的内存,不会每次追加元素都需要分配
  • 不同点
    • sds会根据字符串数组存储的长度来选择不同的结构存储,更加节约空间
    • slice不会对此做区分,实现更加简约
    • sds在计算长度后会+1,用来存储“\0”,这里主要是使用了c相关的字符串函数,故需要兼容

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • go- slice
    • 结构
    • 追加元素
    • 命令
    • 与数组的差异
  • redis-sds
    • 结构
    • redis的sds和go的slice区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档