web-dev-qa-db-ja.com

参照を使用してマップにアクセスする

関数へのポインターとして渡すマップをループしようとしましたが、要素にアクセスする方法が見つかりません。これはコードです:

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)

ブラケットを試しましたが、効果はありませんでした。すべての参照演算子(*&)を削除すると、問題なくコンパイルされます。

これをどのように書けばいいですか?

20
Michael

マップでポインターを使用する必要はありません。

マップタイプは、ポインターやスライスなどの参照タイプです

Sessionを変更する必要がある場合は、ポインターを使用できます。

map[string]*Session

34
jmaloney

最初にマップを逆参照してからアクセスします。

(*sessions)[sid]

また、マップは実際には参照型であるため、ポインターの使用例は非常に限られています。マップ値を関数に渡すだけでは、コンテンツはコピーされません。 再生の例

10
nemo

_*_の優先順位を考慮していません。

_*session[sid]_は実際には*(session[sid])を意味します。つまり、最初にマップへのポインターにインデックスを付け(エラーが発生します)、次にそれを逆参照します。

_(*session)[sid].timestamp_を使用して、最初にマップへのポインターを逆参照し、次にキーを使用してアクセスする必要があります。

9
siritinga