2011-12-16 30 views
33

我尝试编写一个小型应用程序,它使用来自标准输入的“x”个整数,计算平均值并将其返回。我只迄今为止得到:以动态方式初始化数组大小go

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]; 
}............ 

当试图编译此,我得到了以下错误消息:

无效的数组边界elems的

这里有什么问题?

+0

我看到这个地方已经:)让我猜测https://www.hackerrank.com/challenges/simple-array-sum/problem? – bin2hex 2018-02-24 20:09:47

回答

57

你应该使用一个切片:

//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 { 
+0

感谢您的链接!正是我想要的:) – shutefan 2011-12-16 20:43:31

8

在我看来,这从结果使用newmake函数时出现混淆。这是Go语言中的一个已知问题/功能,如通过关于newmakegolang-nuts的若干讨论所证明的。

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而不是 a Go类型(除非elems是Go常数,在这里不是这种情况)。

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

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