使用其引用访问地图

Accessing a map using its reference

我尝试遍历一个映射,我将它作为指向函数的指针传递,但我找不到访问元素的方法。这是代码:

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 行 return 以下编译错误:

./controller.go:120: invalid operation: sessions[sid] (type *map[string]Session does not support indexing)

括号我试过了,没有效果。如果我去掉所有引用运算符 (* &),那么它可以正常编译。

这个要怎么写?

您没有考虑 * 的优先级。

*session[sid] 真正的意思是 *(session[sid]),也就是说,首先索引指向映射的指针(因此出错),然后取消引用它。

您应该使用 (*session)[sid].timestamp 首先取消对地图指针的引用,然后使用密钥访问它。

先取消引用地图,然后访问它 (Example on play):

(*sessions)[sid]

还值得注意的是,映射实际上是引用类型,因此使用指针的用例非常有限。仅将映射值传递给函数不会复制内容。 Example on play.

您不需要在地图上使用指针。

Map types are reference types, like pointers or slices

如果您需要更改 Session 您可以使用指针:

map[string]*Session