web-dev-qa-db-fra.com

Initialiser dynamiquement la taille du tableau en go

J'essaie d'écrire une petite application dans go qui prend un nombre 'x' d'entiers de l'entrée standard, calcule la moyenne et la rend. Je suis seulement arrivé jusqu'ici:

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

Lorsque j'essaye de compiler cela, j'obtiens le message d'erreur suivant:

elems liés au tableau invalides

Qu'est-ce qui ne va pas ici?

48
shutefan

vous devez utiliser une tranche:

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

voir " tilisation des tranches et internes "

Vous pouvez également considérer en utilisant la plage pour votre boucle:

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

À mon avis, cela résulte d'une confusion sur l'utilisation des fonctions new et make. Il s'agit d'un problème/d'une fonctionnalité connu dans le langage Go, comme en témoignent plusieurs discussions sur new vs make à golang-nuts .

La différence entre new et make peut devenir plus claire en laissant Go imprimer le type de la valeur créée par new et 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))
}

Le résultat:

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

Comme on peut le voir sur le type, pour accéder à un élément de tableau de new([10]int), nous devons d'abord déréférencer le pointeur.

new et make nécessitent un type Go comme premier argument. Cependant, l'expression [elems]int N'est pas pas un type Go (sauf si elems est une constante Go, qui n'est pas le cas ici).

Pour plus d'informations, voir http://golang.org/doc/go_spec.html#Allocation et http://golang.org/doc/go_spec.html#The_zero_value .

Pour mieux comprendre si le résultat de new est utilisable, il peut être utile de vérifier si len et cap fonctionnent avec des valeurs nulles (nulles): http://golang.org/doc/go_spec.html#Length_and_capacity

8
user811773

Voir les spécifications du langage de programmation Go

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

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

Il dit: "La longueur fait partie du type du tableau; elle doit être évaluée à une constante non négative représentable par une valeur de type int."

Les constantes ne varient en aucun cas.

1
Codefor