I try to loop through a map, that I pass as a pointer to a function, but I can't find a way to access the elements. This is the 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 )
}
}
}
Line 4 in this example return following compile error:
./controller.go:120: invalid operation: sessions[sid] (type *map[string]Session does not support indexing)
I tried brackets, but it had no effect. If I take away all reference operators (* &) then it compiles fine.
How must I write this?
You don't need to use a pointer with a map.
If you needed to change the Session
you could use a pointer:
map[string]*Session
You are not taking into account the precedence of *
.
*session[sid]
really means *(session[sid])
, that is, first indexing the pointer to map (hence the error), then dereferencing it.
You should use (*session)[sid].timestamp
to first dereference the pointer to the map and then access it using the key.
De-reference the map first and then access it:
(*sessions)[sid]
It's also noteworthy that maps are actually reference types and therefore there is a very limited use-case of using pointers. Just passing a map value to a function will not copy the content. Example on play.