為什么這段代碼有效?具體來說,引用切片范圍 a[5:] 并返回零長度切片的行?長度和容量都報告為 5,但引用第六個不存在的元素不會引起恐慌:package mainimport ( "fmt")func main() { a := []int{1, 2, 3, 4, 5} fmt.Println(a, "Len(a)=", len(a), "Cap(a)=", cap(a)) fmt.Println(a[4]) // Works as expected // fmt.Println(a[5]) // XXX-runtime error:index out of range fmt.Println(a[5:]) // Works--returns a zero-length slice--but why? a = append(a[:4], a[5:]...) fmt.Println(a, "Len(a)=", len(a), "Cap(a)=", cap(a))}去游樂場:https://play.golang.org/p/7evt4Y0ADD3在Go Slice - [:n] 和 [n:] 之間的區別解釋是底層數組實際上比切片長,所以訪問范圍 a[5:] 只是訪問更長的數組。但是,當您運行這段代碼時,您會看到切片的長度和容量實際上報告為 5。如果您取消對 a[5] 的引用的注釋,您會發現這確實會導致預期的恐慌。我可以指望這種行為,還是我遇到了可以在未來版本中修復的規范/編譯器錯誤?
1 回答

慕哥9229398
TA貢獻1877條經驗 獲得超6個贊
這是預期的行為;slice[cap(slice):]
指的是 末尾的零長度切片slice
。根據規范:
對于數組或字符串,如果 0 <= low <= high <= len(a),則索引在范圍內,否則它們超出范圍。對于切片,索引上限是切片容量 cap(a) 而不是長度。
注意是<= len(a)
,不是< len(a)
;根據規范,允許使用等于長度/容量的索引。
- 1 回答
- 0 關注
- 129 瀏覽
添加回答
舉報
0/150
提交
取消