程序员

golang slice学习

2017-01-03  本文已影响89人  Lucas_Ye

1. slice的结构

type slice struct {
      index  *interface  //指向首元素的指针
      len    int         //长度
      cap    int         //容量
}
slice是类型

slice类型声明后类似于:
var arr slice 而非 var arr *slice
append时,如果超过cap容量,会重新分配空间.
新空间的指针会被保存在index中,slice本身的指针不变.
举个栗子🌰:

func F() {
   intArr := make([]int, 1)
   fmt.Println(&intArr[0], len(intArr), cap(intArr))
   defer f(intArr)
   intArr = append(intArr, 1)
   fmt.Println(&intArr[0], len(intArr), cap(intArr))
   return
}

func f(intArr []int) {
   fmt.Println(&intArr[0], len(intArr), cap(intArr))
}

//结果
0xc42000d2d0 1 1
0xc42000d300 2 2
0xc42000d2d0 1 1
func F1() {
   intArr := make([]int, 1)
   fmt.Println(&intArr[0], len(intArr), cap(intArr))
   defer f1(&intArr)
   intArr = append(intArr, 1)
   fmt.Println(&intArr[0], len(intArr), cap(intArr))
   return
}

func f1(ia *[]int) {
   intArr := *ia
   fmt.Println(&intArr[0], len(intArr), cap(intArr))
}

//结果
0xc42000d2d0 1 1
0xc42000d300 2 2
0xc42000d300 2 2

2. slice的扩容

func F() {
     intArr := make([]int, 0, 0)

     intArr = append(intArr, 1)
     fmt.Println(&intArr[0], len(intArr), cap(intArr))

     intArr = append(intArr, 2)
     fmt.Println(&intArr[0], len(intArr), cap(intArr))

     intArr = append(intArr, 3)
     fmt.Println(&intArr[0], len(intArr), cap(intArr))

     intArr = append(intArr, 4)
     fmt.Println(&intArr[0], len(intArr), cap(intArr))
     return
}

//结果
0xc42000d2d0 1 1
0xc42000d300 2 2
0xc4200cc660 3 4
0xc4200cc660 4 4

在对slice进行append等操作时,可能会造成slice的自动扩容。其扩容时的大小增长规则是:

上一篇下一篇

猜你喜欢

热点阅读