86 votes

Initialiser dynamiquement la taille du tableau dans go

J'essaie d'écrire une petite application en go qui prend des nombres 'x' d'entiers à partir d'une entrée standard, calcule la moyenne et la renvoie. Je n'en ai que pour l'instant :

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

En essayant de compiler, j'obtiens le message d'erreur suivant :

éléments liés au tableau non valides

Qu'est-ce qui ne va pas ici ?

133voto

Paolo Falabella Points 10514

Vous devez utiliser une tranche au lieu d'un tableau :

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

Voir " go slices usage and internals ".

Vous pouvez également envisager d' utiliser range pour votre boucle :

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

4voto

Codefor Points 1212

Voir la spécification 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.

-1voto

Steven Penny Points 18523

Pour une autre méthode, affectez simplement quelque chose au dernier élément :

 var a = []string{9: "March"}

Dans le cas ci-dessus, une chaîne vide conviendrait également. Code pour voir le résultat :

 package main
import "fmt"

func main() {
   for n, s := range a {
      fmt.Printf("%v %q\n", n, s)
   }
}

et résultat :

 0 ""
1 ""
2 ""
3 ""
4 ""
5 ""
6 ""
7 ""
8 ""
9 "March"

https://github.com/golang/sys/blob/789bb1bd/windows/types_windows.go#L46-L62

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X