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

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

无效的数组绑定元素

这里有什么问题?

原文由 shutefan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 447
2 个回答

您应该使用切片而不是数组:

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

请参阅“ go 切片用法和内部结构”。你也可能想考虑为你的循环 使用 range

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

原文由 Paolo Falabella 发布,翻译遵循 CC BY-SA 4.0 许可协议

在我看来,这是由于混淆了 newmake 函数的使用。这是 Go 语言中的一个已知问题/功能, golang-nuts 上有关 newmake 的多次讨论证明了这一点。

The difference between new and make may become clearer by letting Go print out the type of the value created by new and 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) 的数组元素,我们首先需要取消引用指针。

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 是否适用 http://golang.org/doc/go_spec.html#Length_and_capacity

原文由 user811773 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题