為什么這段代碼有效?具體來說,引用切片范圍 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:] 之間的區(qū)別解釋是底層數(shù)組實際上比切片長,所以訪問范圍 a[5:] 只是訪問更長的數(shù)組。但是,當(dāng)您運行這段代碼時,您會看到切片的長度和容量實際上報告為 5。如果您取消對 a[5] 的引用的注釋,您會發(fā)現(xiàn)這確實會導(dǎo)致預(yù)期的恐慌。我可以指望這種行為,還是我遇到了可以在未來版本中修復(fù)的規(guī)范/編譯器錯誤?
1 回答
慕哥9229398
TA貢獻1877條經(jīng)驗 獲得超6個贊
這是預(yù)期的行為;slice[cap(slice):]指的是 末尾的零長度切片slice。根據(jù)規(guī)范:
對于數(shù)組或字符串,如果 0 <= low <= high <= len(a),則索引在范圍內(nèi),否則它們超出范圍。對于切片,索引上限是切片容量 cap(a) 而不是長度。
注意是<= len(a),不是< len(a);根據(jù)規(guī)范,允許使用等于長度/容量的索引。
- 1 回答
- 0 關(guān)注
- 149 瀏覽
添加回答
舉報
0/150
提交
取消
