slice

木子中瑜 · · 855 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

slice 数据结构

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

golang 源码

  • 基于数组或者slice生成一个slice的时候,新的slice和原来数组/slice 的底层数组是同一个
  • 基于数组或者slice生成slice的cap=原来对应的数组长度-现在slice的第一个元素对应的索引
  • slice 作为参数传递的是 副本,但是对应的数组的指针不变
  • 扩容规则:
    在一般的情况下,你可以简单地认为新切片的容量(以下简称新容量)将会是原切片容量(以下
    简称原容量)的 2 倍。
    但是,当原切片的长度(以下简称原长度)大于或等于1024时,Go 语言将会以原容量的1.25
    倍作为新容量的基准(以下新容量基准)

slice 数组指针什么情况下会发生变化?

36讲这么说:
确切地说,一个切片的底层数组永远不会被替换。为什么?虽然在扩容的时候 Go 语言一定会生
成新的底层数组,但是它也同时生成了新的切片。它是把新的切片作为了新底层数组的窗口,而
没有对原切片及其底层数组做任何改动。
实际测试:
扩容的时候slice的数组发生了变化,但是slice并没有发送变化.


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:木子中瑜

查看原文:slice

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

855 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传