go数据类型-slice底层

海哥  金牌会员 | 2024-1-16 02:25:59 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 900|帖子 900|积分 2700

切片的底层数据结构

有上篇string为基础了,能猜到slice肯定也有一个对应的struct。
  1.   在runtime的 slice.go中
  2.      type slice struct {
  3.           array unsafe.Pointer
  4.           len   int
  5.           cap   int
  6.   }
复制代码
切片的本质是对数组的引用

len 表示当前已经存储的个数,cap表示容量。
切片的创建


  • 根据数组创建
    1. s := arr[0:31]
    复制代码
  • 字面量:编译时插入创建数组的代码
    1. s := []int{1, 2, 3}
    复制代码
  • make:运行时创建数组
    1. slice := make([lint, 10)
    复制代码
切片的追加

扩容时,编译时转为调用 runtime.growslice()
有兴趣的可以看下源码,方法介绍也能看出一些逻辑。
直接小结:
  1.   1.如果期望容量大于当前容量的两倍就会使用期望容量
  2.    
  3.     比如当前是3,期望9,那么即使翻倍也达不到要求,所以直接变成9.      
  4.   2.如果当前切片的长度小于 1024,将容量翻倍
  5.    
  6.     比如当前容量为3, 如果再加一个值,则容量直接变为 6.
  7.   3.如果当前切片的长度大于 1024,每次增加 25%
  8.    
  9.   4.切片扩容时,并发不安全,注意切片并发要加锁,
  10.   
  11.     因为扩容时候,会新创建一个数组,如果在这个过程中,并发访问可能会是访问老的数组。
  12.     因为数组必须是连续的存储空间,所以每次扩容,都会创建一个新的数组。
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表