在go中动态初始化数组大小

时间:2011-12-16 20:08:54

标签: arrays go

我尝试在go中编写一个小应用程序,从标准输入中获取'x'个整数,计算均值并将其返回。我到目前为止只有这样:

func main() {
var elems, mean int
sum := 0

fmt.Print("Number of elements? ")

fmt.Scan(&elems)

var array = new([elems]int)

for i := 0; i < elems; i++ {
    fmt.Printf("%d . Number? ", i+1)
    fmt.Scan(&array[i])
    sum += array[i];
}............

尝试编译时,我收到以下错误消息:

  

无效的数组绑定元素

这里有什么问题?

4 个答案:

答案 0 :(得分:72)

你应该使用切片:

//var array = new([elems]int) - no, arrays are not dynamic
var slice = make([]int,elems) // or slice := make([]int, elems)

请参阅“go slices usage and internals

您也可以考虑将using range用于循环:

// for i := 0; i < elems; i++ { - correct but less idiomatic
for i, v := range slice {

答案 1 :(得分:8)

在我看来,这源于对newmake函数使用的混淆。这是Go语言中的一个已知问题/功能,正如golang-nuts上有关newmake的几个讨论所证明的那样。

允许Go打印出由newmake创建的值的类型,newmake之间的差异可能会更加明显:

package main

import "fmt"

func main() {
    fmt.Printf("%T  %v\n", new([10]int), new([10]int))
    fmt.Printf("%T  %v\n", make([]int, 10), make([]int, 10))
}

输出:

*[10]int  &[0 0 0 0 0 0 0 0 0 0]
[]int  [0 0 0 0 0 0 0 0 0 0]

从类型可以看出,要访问new([10]int)的数组元素,我们首先需要取消引用指针。

newmake都需要Go类型作为第一个参数。但是,表达式[elems]int 不是一个Go类型(除非elems是Go常量,这不是这里的情况)。

如需进一步参考,请参阅http://golang.org/doc/go_spec.html#Allocationhttp://golang.org/doc/go_spec.html#The_zero_value

为了更好地了解new的结果是否可用,查找lencap是否使用零(零)值可能会有所帮助:{{3 }}

答案 2 :(得分:1)

参见Go编程语言规范

http://golang.org/ref/spec#Array_types

http://golang.org/ref/spec#Constants

它说:“长度是数组类型的一部分;它必须计算为非负常量,可以用int类型的值表示。”

常数决不会有所不同。

答案 3 :(得分:-1)

对于另一种方法,只需为最后一个元素赋值:

var a = []string{9: "March"}

在上面的情况下,空字符串也可以。查看结果的代码:

package main
import "fmt"

func main() {
   for n, s := range a {
      fmt.Printf("%v %q\n", n, s)
   }
}

和结果:

0 ""
1 ""
2 ""
3 ""
4 ""
5 ""
6 ""
7 ""
8 ""
9 "March"

https://github.com/golang/sys/blob/789bb1bd/windows/types_windows.go#L46-L62