Avoir des cartes définies comme:
var valueToSomeType = map[uint8]someType{...}
var nameToSomeType = map[string]someType{...}
Je voudrais une variable qui pointe vers l'adresse des cartes (pour ne pas copier toutes les variables). Je l'ai essayé en utilisant:
valueTo := &valueToSomeType
nameTo := &nameToSomeType
mais en utilisant valueTo[number]
, ça montre
erreur du compilateur interne: var sans type, init: new
Comment l'obtenir?
Modifier
L'erreur a été montrée par un autre problème.
Les cartes sont des types de référence, elles sont donc toujours transmises par référence. Vous n'avez pas besoin d'un pointeur.
Plus précisément, à partir du Golang Specs :
Les tranches, les cartes et les canaux sont les types de référence qui ne nécessitent pas le supplément indirection d'une allocation avec
new
.
La fonction intégrée make prend un typeT
, qui doit être un type tranche, carte ou canal, éventuellement suivi d'une liste d'expressions spécifiques au type.
Il renvoie une valeur de typeT
( pas*T
).
La mémoire est initialisée comme décrit dans la section sur les valeurs initiales
Cependant, concernant appels de fonction , les paramètres sont passés par valeur (toujours).
Sauf que la valeur d'un paramètre de carte est un pointeur.
La réponse de @Mue est correcte.
Le simple programme suivant suffit pour valider:
package main
import "fmt"
func main() {
m := make(map[string]string, 10)
add(m)
fmt.Println(m["tom"]) // expect nil ???
}
func add(m map[string]string) {
m["tom"] = "voldemort"
}
La sortie de ce programme est
voldemort
Si la carte était passée par valeur, l'ajout à la carte dans la fonction add () n'aurait aucun effet dans la méthode principale. Mais nous voyons la valeur ajoutée par la méthode add (). Cela vérifie que le pointeur de la carte est passé à la méthode add ().