2 回答
TA貢獻1821條經驗 獲得超6個贊
Go 規范包含兩個問題的答案:
切片表達式
切片表達式從字符串、數組、指向數組的指針或切片構造子字符串或切片。有兩種變體:一種是指定上限和下限的簡單形式,另一種是指定容量界限的完整形式。
簡單的切片表達式
[片段]
對于數組或字符串,索引在范圍內if
0 <= low <= high <= len(a),否則超出范圍。
由于len(a)is 1,索引 1 在范圍內,但索引 2 超出范圍。
全切片表達式
對于數組、指向數組的指針或切片
a(但不是字符串),主表達式a[low : high : max]構造一個與簡單切片表達式具有相同類型、長度和元素的切片
a[low : high]。此外,它通過將結果切片設置為 來控制結果切片的容量max - low。只有第一個索引可以省略;它默認為 0. ...
閱讀整個規范。它可能會有點慢,但不會那么長。沒有必要全部記住,但是通過一次完整的事情,你應該能夠記住你在某個地方讀過它,然后回去找到你要找的東西。
TA貢獻1998條經驗 獲得超6個贊
切片的容量總是至少與切片的長度相同。未指定時,默認值始終與長度相同。
切片長度的定義是設置到切片中的元素個數。
切片容量的定義是切片可以提供的所有塊,這些塊對調用者是隱藏的,默認值為空(0 表示 int,“”表示字符串)。
當您像這樣調用某個索引a[x]的值時,它將在 indexx的范圍內獲取值length。
但是,當您像這樣重新切片切片時a[x:y],它將在容量x范圍內的索引處獲得切片,直到 y(最大值必須與容量相同)。因此,作為切片的調用者,您可以在整個切片結構中獲取切片的隱藏元素,默認值為空。
如果您沒有像上面那樣指定重新切片(y)的結束 -> a[2:],那么重新切片的默認結束將設置為lenght,這使您的調用a[2:]暗示a[2:1]自slice 的長度為 1。想想看,調用 的子切片a[2:1],會發生什么?正如錯誤消息告訴我們的那樣:
恐慌:運行時錯誤:切片超出范圍 [2:1]
因為您正在從甚至不在容量范圍內的索引中調用子切片(它本身的切片的整個結構)。即使 2 在 slice 的容量范圍內,您的調用也會重疊,因為起始索引大于容量。
總結一下:
如果你像這樣調用 sub-slice -> a[x:] 那么 x 必須在長度范圍內(包括)
如果你像這樣調用 sub-slice -> a[:y] 那么 y 必須在容量范圍內(包括)
如果你像這樣調用 sub-slice -> a[x:y] 那么 x 和 y 必須在容量(包括)和 x<=y 的范圍內。
- 2 回答
- 0 關注
- 218 瀏覽
添加回答
舉報
