首頁 >後端開發 >Golang >為什麼 Go Slices 中不會出現 `a[len(slice)]` 恐慌?

為什麼 Go Slices 中不會出現 `a[len(slice)]` 恐慌?

Susan Sarandon
Susan Sarandon原創
2024-12-12 16:40:10491瀏覽

Why Doesn't `a[len(slice)]` Panic in Go Slices?

Go 令人困惑的切片:為什麼a[len(slice)] 不恐慌

簡介

在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 語言規範規定:

  • 對於陣列和字串,超出範圍的指數定義為低> len(a) 或high > len(a),其中a 為底層數組。
  • 對於切片,超出範圍的索引定義為 high > > cap(a),其中cap(a)表示切片的容量。

在我們的範例中,a是一個數組,其長度為3。但是,拼接到陣列的長度,即 a[3:] 被認為在有效範圍內,因為底層陣列的長度為 3。

如規範所解釋的,「索引上限是切片容量cap(a) 而不是長度。」因此,在本例中,a[3:] 建立一個空切片,因為high - low = 3 - 3 = 0。

一個關鍵區別

重要的是請注意,使用超出切片容量的索引(即我們示例中的a[4:])仍然超出範圍,並將導致運行時恐慌。規格明確指出:「如果運行時索引超出範圍,則會發生運行時恐慌。」

以上是為什麼 Go Slices 中不會出現 `a[len(slice)]` 恐慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn