查找可以使用make()在golang中声明的集合的最大长度值

时间:2016-11-16 11:06:36

标签: go

我面临错误"恐慌:运行时错误: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

1 个答案:

答案 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)
}

https://play.golang.org/p/roOarwQpZL