2011-12-16 120 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