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?
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 {
À 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
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.