1 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
規(guī)范說(shuō)明了任何切片的長(zhǎng)度和容量:
在任何時(shí)候都存在以下關(guān)系:
0?<=?len(s)?<=?cap(s)
這顯然違反了,因?yàn)殚L(zhǎng)度變?yōu)樨?fù)數(shù),因此小于 0。
Ian Lance Taylor 確認(rèn)這是一個(gè)錯(cuò)誤,而不是它應(yīng)該如何工作。正確的行為應(yīng)該是恐慌的說(shuō)法growslice: cap out of range
,它應(yīng)該源自slice.go / growslice()
函數(shù)(growslice()
被稱為來(lái)自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上運(yùn)行它:
2147483645 2147483645
2147483646 2147483646
2147483647 2147483647
-2147483648 2147483647
-2147483647 2147483647
-2147483646 2147483647
MaxInt32正如我們所看到的,一旦達(dá)到32 位架構(gòu)和MaxInt6464 位架構(gòu),容量就會(huì)停止增長(zhǎng)。
- 1 回答
- 0 關(guān)注
- 129 瀏覽
添加回答
舉報(bào)