我的代碼:package mainimport ( "fmt")func main() { a := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} b := a[1:4] fmt.Println("a:", a) fmt.Println("b:", b) // Works fine even though c is indexing past the end of b. c := b[4:7] fmt.Println("c:", c) // This fails with panic: runtime error: index out of range [4] with length 3 // d := b[4]}輸出:a: [0 1 2 3 4 5 6 7 8 9]b: [1 2 3]c: [5 6 7]如果我取消注釋包含 的行d := b[4],則會導(dǎo)致此錯誤:panic: runtime error: index out of range [4] with length 3我的問題:為什么b[4:7]即使索引 4 超出b長度為 3 的范圍也可以訪問,但不能訪問b[4]?什么 Go 語言規(guī)則解釋了這種行為?
1 回答

30秒到達(dá)戰(zhàn)場
TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個贊
相關(guān)規(guī)則:Spec: Index 表達(dá)式和Spec: Slice 表達(dá)式。
簡而言之:索引時,索引必須小于長度。切片時,上索引必須小于或等于容量。
索引時:a[x]
如果,
x
則索引在范圍內(nèi)0 <= x < len(a)
,否則超出范圍
切片時:a[low: high]
對于數(shù)組或字符串,索引在范圍內(nèi)if
0 <= low <= high <= len(a)
,否則超出范圍。對于切片,索引上限是切片容量cap(a)
而不是長度。
當(dāng)你這樣做時:
b := a[1:4]
b
將是一個與 共享后備數(shù)組的切片a
,其b
長度為3
,其容量為9
。因此,稍后切片b
甚至超出其長度也是完全有效的,直到其容量為9
. 但是在索引時,您始終可以僅索引切片長度所覆蓋的部分。
我們使用索引來訪問切片或數(shù)組的當(dāng)前元素,如果我們想要創(chuàng)建數(shù)組或切片的片段,或者想要擴(kuò)展它,我們會使用切片。擴(kuò)展它意味著我們想要更大的部分(但仍然被支持?jǐn)?shù)組覆蓋)。
- 1 回答
- 0 關(guān)注
- 108 瀏覽
添加回答
舉報(bào)
0/150
提交
取消