簡介
在Go中,當對數組或切片進行切片時,人們可能會預期會導致超出基礎數組或切片的長度恐慌。然而,對於切片來說,這種行為卻奇怪地不同。
問題
考慮下面的Go 代碼:
a := []int{1, 2, 3} fmt.Println(a[0:]) fmt.Println(a[1:]) fmt.Println(a[2:]) fmt.Println(a[3:]) // Surprisingly, doesn't panic fmt.Println(a[4:]) // Panics as expected
令人困惑的是切片是[3:] 不會產生恐慌,即使它看起來超過了長度數組。
答案
此行為由Go 語言規範規定:
在我們的範例中,a是一個數組,其長度為3。但是,拼接到陣列的長度,即 a[3:] 被認為在有效範圍內,因為底層陣列的長度為 3。
如規範所解釋的,「索引上限是切片容量cap(a) 而不是長度。」因此,在本例中,a[3:] 建立一個空切片,因為high - low = 3 - 3 = 0。
一個關鍵區別
重要的是請注意,使用超出切片容量的索引(即我們示例中的a[4:])仍然超出範圍,並將導致運行時恐慌。規格明確指出:「如果運行時索引超出範圍,則會發生運行時恐慌。」
以上是為什麼 Go Slices 中不會出現 `a[len(slice)]` 恐慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!