我尝试在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];
}............
尝试编译时,我收到以下错误消息:
无效的数组绑定元素
这里有什么问题?
答案 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)
在我看来,这源于对new
和make
函数使用的混淆。这是Go语言中的一个已知问题/功能,正如golang-nuts上有关new
与make
的几个讨论所证明的那样。
允许Go打印出由new
和make
创建的值的类型,new
和make
之间的差异可能会更加明显:
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)
的数组元素,我们首先需要取消引用指针。
new
和make
都需要Go类型作为第一个参数。但是,表达式[elems]int
不是一个Go类型(除非elems
是Go常量,这不是这里的情况)。
如需进一步参考,请参阅http://golang.org/doc/go_spec.html#Allocation和http://golang.org/doc/go_spec.html#The_zero_value。
为了更好地了解new
的结果是否可用,查找len
和cap
是否使用零(零)值可能会有所帮助:{{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