it-swarm-pt.tech

Inicializar dinamicamente o tamanho da matriz em movimento

Eu tento escrever um pequeno aplicativo que pega 'x' números inteiros da entrada padrão, calcula a média e a devolve. Eu só cheguei até agora:

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

Ao tentar compilar isso, recebo a seguinte mensagem de erro:

elementos vinculados de matriz inválidos

O que há de errado aqui?

48
shutefan

você deve usar uma fatia:

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

consulte " vá para uso de fatias e internos "

Além disso, você pode considerar sando range para o seu loop:

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

Na minha opinião, isso resulta de confusão sobre o uso das funções new e make. Esse é um problema/recurso conhecido no idioma Go, conforme evidenciado por várias discussões sobre new vs make em golang-nuts .

A diferença entre new e make pode ficar mais clara ao permitir que Go imprima o tipo de valor criado por new e 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))
}

A saída:

*[10]int  &[0 0 0 0 0 0 0 0 0 0]
[]int  [0 0 0 0 0 0 0 0 0 0]

Como pode ser visto no tipo, para acessar um elemento da matriz de new([10]int), primeiro precisamos desreferenciar o ponteiro.

new e make requerem um tipo Go como seu primeiro argumento. No entanto, a expressão [elems]int Não é um tipo Go (a menos que elems seja uma constante Go, o que não é o caso aqui).

Para obter mais referências, consulte http://golang.org/doc/go_spec.html#Allocation e http://golang.org/doc/go_spec.html#The_zero_value .

Para entender melhor se o resultado de new é utilizável, pode ser útil verificar se len e cap funcionam com valores zero (nulos): http://golang.org/doc/go_spec.html#Length_and_capacity

8
user811773

Consulte Especificação da linguagem de programação Go

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

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

Ele diz: "O comprimento faz parte do tipo da matriz; deve ser avaliado como uma constante não negativa representável por um valor do tipo int".

As constantes não variam de maneira alguma.

1
Codefor