arrays print 去片-容量/長度?



golang slice pop (1)

嘗試學習現在就從教程中學習,並有一個非常基本的問題:

 func main() {
  a := make([]int, 5)
  // [0,0,0,0,0] len=5 cap=5

  b := make([]int, 0, 5)
  // [] len=0 cap=5

  c := b[:2]
  // [0,0] len=2 cap=5

  d := c[2:5]
  // [0,0,0] len=3 cap=3
}

為什麼c看起來像[0,0]和長度為2? b本來不是零,所以是[] 。 因此,設置cb[:2]前兩個元素為零?

另外,為什麼d 3的容量? 很困惑。

提前致謝。


所有的變量都有一個切片類型 。 切片有一個後備數組 。 在Go中,您無法訪問未初始化的變量。 如果您在創建新變量時未明確提供值,則將使用變量類型的零值初始化它們。

這意味著當你用make([]int, 0, 5)創建一個slice時,它也創建一個backing數組,backing數組將被初始化為零值,並且這個zeroed數組將被分割 。 數組類型的零值是每個元素具有元素類型的零值的數組。

所以,即使你沒有明確設置backing數組的每個元素為0 ,他們也會自動歸零。 所以當你做c := b[:2] ,它會切割b切片,而c的長度是2,這2個元素將是0

而當你做d := c[2:5]切片c片時,它的長度將是5-2 = 3 ,其容量也將是5-2 = 3因為切片將導致一個新的片它共享相同的後備數組 ,並且容量將是直到後備數組的最後一個元素的第一個元素(除非使用完整的分片表達式來控制結果分片的容量)。

必須閱讀的博客帖子,希望了解片和數組的新手:

Go博客:切片:使用和內部

Go博客:數組,切片(和字符串):“追加”的機制





slice