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

shu*_*fan 51 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];
}............
Run Code Online (Sandbox Code Playgroud)

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

无效的数组绑定元素

这有什么不对?

Pao*_*lla 79

你应该使用一个切片:

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

看" 切片使用和内部 "

您也可以考虑使用循环范围:

// for i := 0; i < elems; i++ { - correct but less idiomatic
for i, v := range slice {
Run Code Online (Sandbox Code Playgroud)

  • 应该是`slice:= make([] int,elems)`以避免混淆. (2认同)

小智 9

在我看来,这是因为对newmake函数的使用产生了混淆.这是Go语言的已知问题/功能,约了几次讨论证明newVS makegolang螺母.

之间的差异new,并make可以通过放手打印出所创造的价值的类型变得更加清晰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))
}
Run Code Online (Sandbox Code Playgroud)

输出:

*[10]int  &[0 0 0 0 0 0 0 0 0 0]
[]int  [0 0 0 0 0 0 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)

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

双方newmake需要转到类型作为其第一个参数.但是,表达式[elems]int a转到类型(除非elems是一个围棋恒定,这是不这里的情况).

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

为了更好地理解的结果是否new是可用的,它可能有助于查找是否lencap零(零)值工作:http://golang.org/doc/go_spec.html#Length_and_capacity