【问题标题】:How to allocate a non-constant sized array in Go如何在 Go 中分配非常量大小的数组
【发布时间】:2017-05-05 20:21:55
【问题描述】:

如何在 Go 中分配具有运行时大小的数组?

以下代码是非法的:

 n := 1
 var a [n]int

您会收到消息prog.go:12: invalid array bound n(或类似的),而这工作正常:

 const n = 1
 var a [n]int

问题是,我可能直到运行时才知道我想要的数组的大小。

(顺便说一句,我首先在问题How to implement resizable arrays in Go 中寻找答案,但这是一个不同的问题。)

【问题讨论】:

    标签: arrays go


    【解决方案1】:

    答案是你不直接分配一个数组,你可以在创建一个时让Go为你分配一个 切片

    内置函数make([]T, length, capacity) 创建一个切片及其后面的数组,并且length 和@ 的值没有(愚蠢的)编译时间常数限制987654324@。正如Go language specification 中所说:

    使用make 创建的切片总是分配一个新的隐藏数组,返回的切片值指向该数组。

    所以我们可以这样写:

     n := 12
     s := make([]int, n, 2*n)
    

    并有一个分配大小为2*n 的数组,其中s 一个切片被初始化为它的前半部分。

    我不确定为什么 Go 不直接分配数组 [n]int,因为你可以间接分配,但答案很明确:“在 Go 中,使用切片而不是数组(大多数时间)。"

    【讨论】:

    • 甚至反射包似乎也不允许分配动态大小的数组。我怀疑这与类型系统有关,因为数组大小是类型的一部分,所以动态大小需要动态生成新的类型 ID。
    • @Evan 是的,虽然我避免使用 dynamic 来描述这一点。严格来说,数组大小不是动态的:一旦创建,数组大小就是固定的。我想这与您无法获取切片后面的数组这一事实有关。如果可以的话,您可以查看它的类型,并且必须重新生成它。这有点道理。
    • 我已经接受了我自己的答案,因为它似乎是正确的。
    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2013-03-26
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多