web-dev-qa-db-fra.com

Accéder à une carte à l'aide de sa référence

J'essaie de parcourir une carte, que je passe comme un pointeur vers une fonction, mais je ne trouve pas un moyen d'accéder aux éléments. Voici le code:

func refreshSession(sessions *map[string]Session) {
    now := time.Now()
    for sid := range *sessions {
        if now.After(*sessions[sid].timestamp.Add(sessionRefresh)) {
            delete( *sessions, sid )
        }
    }
}

La ligne 4 de cet exemple renvoie l'erreur de compilation suivante:

./controller.go:120: invalid operation: sessions[sid] (type *map[string]Session does not support indexing)

J'ai essayé des crochets, mais cela n'a eu aucun effet. Si je retire tous les opérateurs de référence (* &), cela se compile très bien.

Comment dois-je écrire cela?

20
Michael

Vous n'avez pas besoin d'utiliser un pointeur avec une carte.

Les types de carte sont des types de référence, comme des pointeurs ou des tranches

Si vous aviez besoin de changer le Session vous pourriez utiliser un pointeur:

map[string]*Session

34
jmaloney

Déréférencer d'abord la carte, puis y accéder:

(*sessions)[sid]

Il convient également de noter que les cartes sont en fait des types de référence et qu'il existe donc un cas d'utilisation très limité de l'utilisation de pointeurs. Le simple fait de transmettre une valeur de carte à une fonction ne copiera pas le contenu. Exemple sur le je .

10
nemo

Vous ne tenez pas compte de la priorité de *.

*session[sid] Signifie vraiment *(session[sid]), c'est-à-dire d'abord indexer le pointeur sur la carte (d'où l'erreur), puis le déréférencer.

Vous devez utiliser (*session)[sid].timestamp Pour déréférencer le pointeur sur la carte, puis y accéder à l'aide de la clé.

9
siritinga