我的 golang 学习笔记系列一:什么是切片

切片定义

  • Go 语言切片是对数组的抽象。
  • Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

切片的容量与长度

  • 切片扩容的规则源码位置:/usr/local/go/src/runtime/slice.go 下的 growslice 函数

  • 容量和长度的关系:初始时切片的容量和长度是相同的,如果切片的长度增加,已有容量不足以满足长度,则go底层会将容量增加一倍,增加方式为copy出一个新的,旧的会被释放掉(大于1024之后规则有所变化),以满足长度增加,示例如下:

    func TestArr(t *testing.T) {
      arr1 :=[]int{1,2,3,4}
      // cap 获取切片的容量
      // len 获取切片的长度
      //
      fmt.Printf("切片arr1:的容量 %v,长度为:%v, 地址为:%p \n" ,cap(arr1),len(arr1),&arr1)
      // append 像切片中追加新元素  可以追加多个
      // arr2 并不是一个引用 arr1的值,是go底层copy出的一个新的值
      arr2 := append(arr1,22,33)
      fmt.Printf("切片arr2的容量2:%v,长度为:%v, 地址为:%p \n",cap(arr2),len(arr2),&arr2)
    
      // 初始时切片的容量和长度是相同的,如果切片的长度增加,已有容量不足以满足长度,则go底层会将容量增加一倍,以满足长度增加
    }
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!