2015-02-07 13 views
11

Próbuję przeglądać mapę, którą przekazuję jako wskaźnik do funkcji, ale nie mogę znaleźć sposobu na dostęp do elementów. Jest to kod:Golang: Uzyskiwanie dostępu do mapy za pomocą jej odwołania

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

Linia 4 w tym przykładzie zamian następujący błąd kompilacji:

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

Próbowałem wsporników, ale to nie miało żadnego wpływu. Jeśli zabiorę wszystkie operatory referencyjne (* &), to kompiluje się dobrze.

Jak mogę to napisać?

Odpowiedz

21

Nie trzeba używać wskaźnika z mapą.

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

Jeśli potrzebne, aby zmienić Session można użyć wskaźnika:

map[string]*Session

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

+0

, czy byłyby przypadki, w których jest prawdopodobne, że klucz mapy jest wskaźnikiem typu X? – Roylee

+0

Masz na myśli coś w stylu 'map [* T] string'? – jmaloney

8

Nie bierzesz pod uwagę priorytetu *.

*session[sid] to znaczy najpierw *(session[sid]), czyli najpierw indeksowanie wskaźnika do mapy (stąd błąd), a następnie dereferencja.

Powinieneś użyć (*session)[sid].timestamp, aby najpierw wyłuskać wskaźnik na mapę, a następnie uzyskać do niego dostęp za pomocą klawisza.

+0

to próbowałem, ale mam ten sam komunikat. – Michael

+1

Uważam, że jest to bardzo rzadkie. Próbowałem i działa: http://play.golang.org/p/85Mj8RixGm. Jeśli rozwiązania @jmaloney działają dla Ciebie, czy na pewno używasz tego samego kodu, który tutaj zamieściłeś? – siritinga

+0

Miałem inne problemy w kodzie. Więc się zmieniło. Zaktualizowałem go w powyższym pytaniu. Ale problem, który po raz pierwszy odeszłam po tym, jak pozbyłam się wszystkich * i &. – Michael

6

De odniesienie mapę, a potem do niego dostęp:

(*sessions)[sid] 

To również zauważyć, że mapy są faktycznie odwołać typów i dlatego jest bardzo ograniczone zastosowanie, przypadek wykorzystania wskazówek. Podanie wartości mapy do funkcji nie spowoduje skopiowania zawartości. Example on play.

+0

Próbowałem tego, ale otrzymałem tę samą wiadomość. – Michael

+0

to działało dla mnie, aktualizując pytanie o mapę – Hokutosei

Powiązane problemy