2015-02-07 14 views
11

Cerco di eseguire il ciclo di una mappa, che passo come puntatore a una funzione, ma non riesco a trovare un modo per accedere agli elementi. Questo è il codice:Golang: accesso a una mappa usando il suo riferimento

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

linea 4 in questo esempio cambio seguente errore di compilazione:

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

ho provato parentesi, ma non ha avuto alcun effetto. Se togli tutti gli operatori di riferimento (* &), compila bene.

Come devo scrivere questo?

risposta

21

Non è necessario utilizzare un puntatore con una mappa.

Map types are reference types, like pointers or slices[1]

Se avete bisogno di cambiare il Session si potrebbe usare un puntatore:

map[string]*Session

[1]https://blog.golang.org/go-maps-in-action

+0

, ci sarebbero casi in cui è plausibile che la chiave di una mappa sia puntatore di tipo x? – Roylee

+0

Intendi qualcosa come 'map [* T] string'? – jmaloney

8

Non si sta prendendo in considerazione la precedenza di *.

*session[sid] significa in realtà *(session[sid]), ovvero, prima indicizzazione del puntatore per mappare (da cui l'errore), quindi dereferenziarlo.

È necessario utilizzare (*session)[sid].timestamp per rimuovere il puntatore del mouse sulla mappa e quindi accedervi utilizzando il tasto.

+0

Ho provato questo, ma ho ottenuto lo stesso messaggio. – Michael

+1

Lo trovo molto raro. L'ho provato e funziona: http://play.golang.org/p/85Mj8RixGm. Se le soluzioni di @jmaloney funzionano per te, sei sicuro di utilizzare lo stesso codice che hai postato qui? – siritinga

+0

Ho avuto altri problemi nel codice. Quindi è cambiato. L'ho aggiornato nella domanda sopra. Ma il problema che avevo prima era andato via dopo essermi liberato di tutti * e &. – Michael

6

De riferimento la mappa e poi accedervi:

(*sessions)[sid] 

E 'anche interessante notare che le mappe sono in realtà riferimento tipi e quindi non c'è un caso d'uso molto limitato di utilizzo di puntatori. Il semplice passaggio di un valore di una mappa a una funzione non copierà il contenuto. Example on play.

+0

Ho provato questo, ma ho ricevuto lo stesso messaggio. – Michael

+0

questo ha funzionato per me, aggiornando una domanda sulla mappa – Hokutosei

Problemi correlati