我有下面的代碼在64位Linux操作系統在4Gb的機器上運行:在Go
package main
import (
"fmt"
"math"
)
func main() {
r := make([]bool, math.MaxInt32)
fmt.Println("Size: ", len(r))
}
當我運行此我得到:
Size: 2147483647
如果我改變math.MaxInt32
爲math.MaxUint32
我得到:
fatal error: runtime: out of memory
隨着math.MaxUint32
片大小我跑內存不足,我期待的是,但是當我嘗試使用math.MaxInt64
我得到:
panic: runtime error: makeslice: len out of range
所以aparently我不能以大小的math.MaxInt64
,這給我們帶來了我的問題創建一個切片:如果內存是不是一個問題,我無法在Go中創建最大的切片?
我記得,在Java中,原數組索引與類型int
管理,因此原始數組的最大尺寸是int
的最大值,如果你試圖用long
這樣做會引發異常(據我記憶),這跟Go一樣嗎? Go中的切片索引綁定到一個特定的類型?
編輯:
我使用struct{}
代替bool
和分配math.MaxInt64
元素運行測試。一切都如預期,並打印:
Size: 9223372036854775807
所以,另外一個問題,爲什麼有兩種不同的錯誤信息時,它似乎錯誤是一樣的(沒有足夠的內存)?
每個錯誤彈出的條件是什麼?
所以看來這是錯誤信息含糊,僅此而已...... :) –