亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 子切片

Golang 子切片

Go
開心每一天1111 2022-06-27 17:06:33
在 Go 中,為什么這段代碼有效:package mainimport (  "fmt")func main() {  a := []int{1}  a = a[1:]  fmt.Println(len(a))}但這不是:package mainimport (  "fmt")func main() {  a := []int{1}  a = a[2:]  fmt.Println(len(a))}我聽說過切片的容量,有人可以詳細說明嗎?
查看完整描述

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. ...

閱讀整個規范。它可能會有點慢,但不會那么長。沒有必要全部記住,但是通過一次完整的事情,你應該能夠記住你在某個地方讀過它,然后回去找到你要找的東西。


查看完整回答
反對 回復 2022-06-27
?
米琪卡哇伊

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 的范圍內。


查看完整回答
反對 回復 2022-06-27
  • 2 回答
  • 0 關注
  • 218 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號