在 Go 中進行超出長度的切片
在 Go 中對切片進行切片時,可以指定超出其長度的索引。為什麼會發生這種行為以及它的意義是什麼?
根據 Go 規範,如果 0 ≤ low ≤ high ≤ len(a),則陣列和切片索引被視為在範圍內。因此,對於陣列或字串,索引在 len(a) 之前(包括 len(a))有效。然而,對於切片,索引上限是由它們的容量 cap(a) 而不是它們的長度決定的。
在給定的範例中,
a := []int{1, 2, 3} fmt.Println(a[0:]) fmt.Println(a[1:]) fmt.Println(a[2:]) fmt.Println(a[3:]) // doesn't panic - why?? fmt.Println(a[4:]) // panics as expected
a[3:] 不恐慌,因為它引用了底層數組的一部分,該部分超出了切片的當前長度,但仍在其容量範圍內。這會產生一個空切片。然而,a[4:] 會觸發恐慌,因為它超出了陣列的實際長度。
根據規範,存取指定範圍之外的索引會導致運行時恐慌。然而,在切片的情況下,容量可以被認為是切片目的的擴展範圍,允許索引高達 len(a)。
以上是為什麼 Go 切片允許索引超出其長度而不會驚慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!