您在尝试在 Go 中创建各种大小的切片时遇到了内存分配问题。让我们深入探讨一下这些限制背后的原因。
根据 Go 文档,切片元素的索引值范围为 0 到 len(s)-1,这表明切片的最大容量由目标构建上的本机整数的大小。
在检查源代码时,我们发现了一项安全检查,可确保创建特定大小的切片是可行:
if len64 < 0 || int64(len) != len64 || t.elem.size > 0 && uintptr(len) > maxmem/uintptr(t.elem.size) { panic(errorString("makeslice: len out of range")) }
在您的情况下,条件 uintptr(len) > maxmem/uintptr(t.elem.size) 变为 true,禁止请求的分配。这是因为切片所需的内存将超过最大内存限制。
但是,当您分配一个不消耗内存的空结构切片时,相同的分配大小是允许的:
r := make([]struct{}, math.MaxInt64)
这是因为评估内存需求的条件变为 false,因为空结构不消耗内存。 Go 允许为此类类型创建具有非常大容量的切片。
以上是是什么限制了 Go 切片的最大大小,以及为什么空结构会产生影响?的详细内容。更多信息请关注PHP中文网其他相关文章!