【发布时间】:2015-02-23 05:04:27
【问题描述】:
我在 4Gb 机器的 64 位 linux 操作系统中运行以下代码:
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
所以显然我无法创建大小为 math.MaxInt64 的切片,这让我们想到了一个问题:如果内存不是问题,那么我在 Go 中无法创建的最大切片是什么?
我记得,在 Java 中,原始数组索引是使用 int 类型管理的,所以原始数组的最大大小是 int 的最大值,如果您尝试使用 long它会引发异常(据我所知),Go 也一样吗? Go 中的切片索引是否绑定到一种特定类型?
编辑:
我使用struct{} 而不是bool 运行测试并分配math.MaxInt64 元素。一切都按预期进行,并打印:
Size: 9223372036854775807
那么,另一个问题,为什么在看起来错误相同(内存不足)时会出现两条不同的错误消息?
每个错误弹出的条件是什么?
【问题讨论】:
-
看来这是错误信息不明确的问题,仅此而已... :)