go中的slice的len(长度) 和cap(容量)的变化的一点小问题

18657127505 · · 2571 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

###### 在go中,slice底层是引用的数组, 当slice进行扩容的时候,如果超出了原先设定的范围,引用的对象会发生变化,当然容量和长度也会发生改变,下面我们用数组的切片进行slice的赋值,看看发生了什么 ```go package main import "fmt" func main() { arr := [5]int{1, 2, 3, 4, 5} slice := arr[:3] slice01:= arr[1:3] slice02:= arr[0:1] fmt.Printf("slice before: %v , the len: %v , the cap: %v \n",slice, len(slice), cap(slice)) slice[1]=100 fmt.Printf("arr[1] : %v \n",arr[1]) //观察切片赋值的时候是什么因素决定了slice容量 fmt.Printf("slice01 : %v , the len: %v , the cap: %v \n",slice01, len(slice01), cap(slice01)) fmt.Printf("slice02 : %v , the len: %v , the cap: %v \n",slice01, len(slice02), cap(slice02)) slice=append(slice, 4,5,6) //扩容后的容量变成什么了?还有引用的变化 fmt.Printf("slice after: %v , the len: %v , the cap: %v \n",slice, len(slice), cap(slice)) //我们尝试再次改变slice的值 slice[1]=1000 fmt.Printf("arr[1] : %v \n",arr[1]) } ``` 以下是上面程序的输出: ``` slice before: [1 2 3] , the len: 3 , the cap: 5 arr[1] : 100 //arr[1]的值对应slice[1]的值,这和我们设想的一样 slice01 : [100 3] , the len: 2 , the cap: 4 //切片赋值时,slice的cap容量只是和开始索引有关系,cap=引用对象的cap - 开始索引 slice02 : [100 3] , the len: 1 , the cap: 5 slice after: [1 100 3 4 5 6] , the len: 6 , the cap: 10 //容量是之前数组的cap的2倍 : 5-->10 arr[1] : 100 //arr[1]的值并没有改变成1000,可见,引用的数组已经不是原先的那个arr了 ```

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

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

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