2011-12-16 2 views
33

Я пытаюсь написать небольшое приложение в go, которое принимает «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

ответ

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

+0

@Paolo: Вам нужно будет написать «for i, _: = range array {}». По-моему, использование здесь «для i: = 0; i

+0

@Atom: Я думал, что он может использовать 'v' вместо' array [i] 'в цикле. Но я согласен с тем, что мой поиск кода _idiomatic_ иногда преувеличивается (я один из тех людей, которые за границей ищут _typical_ рестораны и получают _typically_ сорваны) –

8

На мой взгляд, это результат путаницы в использовании функций new и make. Это известная проблема/особенность на языке Go, о чем свидетельствуют несколько дискуссий о new против make по адресу golang-nuts.

Разница между 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 равно не a Тип типа (если elems - постоянная Go, что здесь не так).

Для получения дополнительной информации см. http://golang.org/doc/go_spec.html#Allocation и http://golang.org/doc/go_spec.html#The_zero_value.

Чтобы получить лучшее понимание того, является ли результат new можно использовать, это может быть полезно для поиска ли len и cap работа с нулевым (ноль) значений: http://golang.org/doc/go_spec.html#Length_and_capacity

1

See The Go Язык программирования Спецификация

http://golang.org/ref/spec#Array_types

http://golang.org/ref/spec#Constants

Он говорит: "длина является частью обр тип ay; он должен оценивать неотрицательную константу , представляемую значением типа int. "

Константы отнюдь не меняются.

Смежные вопросы