Динамически инициализировать размер массива на ходу - PullRequest
48 голосов
/ 17 декабря 2011

Я пытаюсь написать небольшое приложение на ходу, которое берет '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];
}............

При попытке скомпилировать это я получаю следующее сообщение об ошибке:

недопустимый связанный массив массив элементов

Что здесь не так?

Ответы [ 3 ]

73 голосов
/ 17 декабря 2011

Вы должны использовать ломтик:

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

см. " go использование ломтиков и внутренних компонентов "

Также вы можете рассмотреть , используя диапазон для вашего цикла:

// for i := 0; i < elems; i++ { - correct but less idiomatic
for i, v := range slice {
8 голосов
/ 17 декабря 2011

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

Разница между new и make может стать более ясным, если позволить Go распечатать тип значения, созданного 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 в качестве 1-го аргумента.Однако выражение [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 с нулем (ноль)значения: http://golang.org/doc/go_spec.html#Length_and_capacity

1 голос
/ 03 декабря 2013

См. Спецификацию языка программирования Go

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

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

В нем говорится: «Длина является частью типа массива; она должна быть оценена как неотрицательная константа , представляемая значением типа int.»

Константы никоим образом не меняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...