2015-02-07 46 views
11

我嘗試循環地圖,將地圖作爲指向函數的指針傳遞,但我無法找到訪問元素的方法。這是代碼:Golang:使用其參考地址訪問地圖

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) 

我試過括號,但它沒有任何效果。如果我拿走所有參考操作符(* &),那麼它編譯好。

我該怎麼寫呢?

回答

21

您不需要在地圖上使用指針。

Map types are reference types, like pointers or slices[1]

如果你需要改變Session,你可以使用指針:

map[string]*Session

[1]https://blog.golang.org/go-maps-in-action

+0

問題,是否會有情況下,其似乎有一個地圖的關鍵是指針的x型? – Roylee 2016-05-09 00:33:03

+0

你的意思是像'map [* T] string'嗎? – jmaloney 2016-05-09 00:51:47

8

您沒有考慮到*的優先順序。

*session[sid]真的意味着*(session[sid]),也就是說,首先索引映射指針(因此錯誤),然後解引用它。

您應該使用(*session)[sid].timestamp先將指針取消引用到地圖,然後使用該鍵訪問它。

+0

我想這一點,但我得到了同樣的信息。 – Michael 2015-02-07 16:36:29

+1

我覺得這很罕見。我試了一下,它的工作原理:http://play.golang.org/p/85Mj8RixGm。如果@ jmaloney解決方案適合您,您確定您使用的是您在此發佈的相同代碼嗎? – siritinga 2015-02-07 16:40:34

+0

我在代碼中有其他問題。所以它改變了。我在上面的問題中更新了它。但是,我擺脫了所有*和&後,我首先離開的問題就消失了。 – Michael 2015-02-08 07:46:12

6

去參考地圖,然後再訪問它:

(*sessions)[sid] 

這也是值得注意的是,地圖實際上是引用類型,因此有使用指針非常有限的用例。只需將一個映射值傳遞給一個函數就不會複製內容。 Example on play

+0

我試過這個,但是我得到了同樣的信息。 – Michael 2015-02-07 16:35:41

+0

這工作對我來說,更新地圖 – Hokutosei 2016-06-29 08:39:01