我面临错误"恐慌:运行时错误:makelice:len超出范围",同时创建动态数组,使用" make()& #34;
例如
arr := make([]int, length) //length is a dynamic value
我知道,这里已经提出了这个问题(Maximum length of a slice in Go)。 但是,make方法不支持" int"的最大值。 golang中的数据类型。它们使用基于结构类型(大小)的长度值。 是否有任何预定义的API可用于查找可以在golang中声明的集合的最大长度值?
例如:
maxInt := int(^uint(0) >> 1)
arr := make([]struct{}, maxInt-1) //accepted
arr := make([]int, maxInt-1) //throw error
答案 0 :(得分:2)
如果您确实需要切片的最大长度,则可以复制运行时包中使用的算法。这将以slice元素为例确定其大小,并返回该值类型的最大切片容量。
func maxSliceCap(i interface{}) int {
_64bit := uintptr(1 << (^uintptr(0) >> 63) / 2)
var goosWindows, goosDarwin, goarchArm64 uintptr
switch runtime.GOOS {
case "darwin":
goosDarwin = 1
case "windows":
goosWindows = 1
}
switch runtime.GOARCH {
case "arm64":
goarchArm64 = 1
}
heapMapBits := (_64bit*goosWindows)*35 + (_64bit*(1-goosWindows)*(1-goosDarwin*goarchArm64))*39 + goosDarwin*goarchArm64*31 + (1-_64bit)*32
maxMem := uintptr(1<<heapMapBits - 1)
elemSize := reflect.ValueOf(i).Type().Size()
max := maxMem / elemSize
if int(max) < 0 {
return 1<<31 - 1
}
return int(max)
}