web-dev-qa-db-fra.com

Pointeur sur une carte

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.

49
user316368

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.

94
themue

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 type T, 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 type T ( 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.

44
VonC

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 ().

0
sabbir