為什麼 Go 中切片可以被切片到底層數組的長度?
Go 陣列和切片提供了便捷的使用方式資料收集。一個可能看起來令人驚訝的特殊行為是能夠將切片切成其長度而不是其容量。為了理解這一點,讓我們深入研究 Go 規範。
根據Go 規範的切片表達式部分,對於數組或字串,如果滿足以下條件,則認為索引在範圍內:
0 <= low <= high <= len(a)
如果指數超出此範圍,則被視為超出範圍。然而,對於切片來說,上索引界限是切片容量,用 cap(a) 表示,而不是長度,用 len(a) 表示。
這表示對切片的以下切片操作a 最多允許len(a)(包括len(a)):
a[0:] a[1:] a[2:]
在這些情況下,生成的切片從索引0開始,長度為0,分別為1 和2。
但是,超出a 長度的切片會導致恐慌:
a[3:] // Doesn't panic (empty slice) a[4:] // Panics
a[3:] 切片不會恐慌,因為索引為3位於[0, len(a)] 範圍內,即使它會導致空切片。另一方面,a[4:] 會發生恐慌,因為索引 4 超出了範圍,其中範圍定義為 [0, len(a))。
因此,Go 允許切片的長度為底層數組,因為規範明確指出切片的索引上限是由容量而不是長度定義的。這種行為可以實現方便的切片操作,而不會在常見場景中引起意外的恐慌。
以上是為什麼 Go 切片可以被切片到它們的長度,而不僅僅是它們的容量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!