Ответ 1
Вам не нужно использовать указатель с картой.
Типы карт - это ссылочные типы, такие как указатели или фрагменты.
Если вам нужно изменить Session
вы можете использовать указатель:
map[string]*Session
Я пытаюсь пропустить карту, которую я передаю как указатель на функцию, но я не могу найти способ доступа к элементам. Это код:
func refreshSession(sessions *map[string]Session) {
now := time.Now()
for sid := range *sessions {
if now.After(*sessions[sid].timestamp.Add(sessionRefresh)) {
delete( *sessions, sid )
}
}
}
Строка 4 в этом примере возвращает следующую ошибку компиляции:
./controller.go:120: invalid operation: sessions[sid] (type *map[string]Session does not support indexing)
Я попробовал скобки, но это не повлияло. Если я заберу все ссылочные операторы (* &), тогда он скомпилируется отлично.
Как мне написать это?
Вам не нужно использовать указатель с картой.
Типы карт - это ссылочные типы, такие как указатели или фрагменты.
Если вам нужно изменить Session
вы можете использовать указатель:
map[string]*Session
Вы не учитываете приоритет *
.
*session[sid]
действительно означает *(session[sid])
, то есть сначала индексирует указатель на отображение (следовательно, ошибку), а затем разыменовывает его.
Вы должны использовать (*session)[sid].timestamp
, чтобы сначала разыменовать указатель на карту, а затем получить доступ к ней с помощью ключа.
Сначала отмените ссылку на карту и затем выполните ее:
(*sessions)[sid]
Также следует отметить, что карты являются фактически ссылочными типами, и поэтому существует очень ограниченный случай использования указателей. Просто передача значения карты функции не будет копировать содержимое. Пример игры.