Доступ к карте по ее ссылке

Я пытаюсь пропустить карту, которую я передаю как указатель на функцию, но я не могу найти способ доступа к элементам. Это код:

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)

Я попробовал скобки, но это не повлияло. Если я заберу все ссылочные операторы (* &), тогда он скомпилируется отлично.

Как мне написать это?

Ответ 2

Вы не учитываете приоритет *.

*session[sid] действительно означает *(session[sid]), то есть сначала индексирует указатель на отображение (следовательно, ошибку), а затем разыменовывает его.

Вы должны использовать (*session)[sid].timestamp, чтобы сначала разыменовать указатель на карту, а затем получить доступ к ней с помощью ключа.

Ответ 3

Сначала отмените ссылку на карту и затем выполните ее:

(*sessions)[sid]

Также следует отметить, что карты являются фактически ссылочными типами, и поэтому существует очень ограниченный случай использования указателей. Просто передача значения карты функции не будет копировать содержимое. Пример игры.