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

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

切片 - 結束時不要恐慌

切片 - 結束時不要恐慌

Go
守著星空守著你 2023-05-08 15:01:12
為什么這段代碼有效?具體來說,引用切片范圍 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);根據規范,允許使用等于長度/容量的索引。


查看完整回答
反對 回復 2023-05-08
  • 1 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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