関数へのポインターとして渡すマップをループしようとしましたが、要素にアクセスする方法が見つかりません。これはコードです:
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
最初にマップを逆参照してからアクセスします。
(*sessions)[sid]
また、マップは実際には参照型であるため、ポインターの使用例は非常に限られています。マップ値を関数に渡すだけでは、コンテンツはコピーされません。 再生の例 。
_*
_の優先順位を考慮していません。
_*session[sid]
_は実際には*(session[sid])
を意味します。つまり、最初にマップへのポインターにインデックスを付け(エラーが発生します)、次にそれを逆参照します。
_(*session)[sid].timestamp
_を使用して、最初にマップへのポインターを逆参照し、次にキーを使用してアクセスする必要があります。