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?
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
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 .
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é.