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

18657127505 · 2018-08-30 22:46:04 · 2784 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-08-30 22:46:04 的主题,其中的信息可能已经有所发展或是发生改变。

在go中,slice底层是引用的数组, 当slice进行扩容的时候,如果超出了原先设定的范围,引用的对象会发生变化,当然容量和长度也会发生改变,下面我们用数组的切片进行slice的赋值,看看发生了什么
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

2784 次点击  
加入收藏 微博
1 回复  |  直到 2018-08-31 10:31:08
yangxuan0261
yangxuan0261 · #1 · 7年之前

<go语言实战>中有图文解释, 复制拷贝后就不再是同一个内存块了

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