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

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

將項目附加到最大大小切片時的附加行為

將項目附加到最大大小切片時的附加行為

Go
POPMUISE 2023-05-15 15:18:42
我對附加到已經具有最大可能大小的切片時的行為感到困惑。據我了解,切片的最大大小可以是 int32 或 int64,具體取決于您的系統。執行時,我得到了符合我預期的test := make([]struct{},math.MaxInt64+1)錯誤。len argument too large in make([]struct {})但是當做類似的事情時:test := make([]struct{},math.MaxInt64)for i:=0;i<100 ; i++ {    test = append(test, struct{}{})}fmt.Println(len(test))我預計程序會出現恐慌,但令人驚訝的是,代碼運行時沒有任何問題,并len返回一個溢出的值-9223372036854775709。有人可以詳細說明這種行為嗎?(我用的是go1.11.2 linux/amd64)
查看完整描述

1 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

規范說明了任何切片的長度和容量:

在任何時候都存在以下關系:

0?<=?len(s)?<=?cap(s)

這顯然違反了,因為長度變為負數,因此小于 0。

Ian Lance Taylor 確認這是一個錯誤,而不是它應該如何工作。正確的行為應該是恐慌的說法growslice: cap out of range,它應該源自slice.go / growslice()函數(growslice()被稱為來自append())。

如果我們將您的示例稍微修改為:

s := make([]struct{}, math.MaxInt32-2)

fmt.Println(len(s), cap(s))

for i := 0; i < 5; i++ {

? ? s = append(s, struct{}{})

? ? fmt.Println(len(s), cap(s))

}

并在Go Playground上運行它:


2147483645 2147483645

2147483646 2147483646

2147483647 2147483647

-2147483648 2147483647

-2147483647 2147483647

-2147483646 2147483647

MaxInt32正如我們所看到的,一旦達到32 位架構和MaxInt6464 位架構,容量就會停止增長。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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