我的 golang 學習筆記系列一:什麼是切片

hengbo_liu發表於2021-10-15

切片定義

  • 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 協議》,轉載必須註明作者和本文連結

相關文章