Pointers 使用地图的引用访问地图

Pointers 使用地图的引用访问地图,pointers,dictionary,go,Pointers,Dictionary,Go,我尝试循环遍历一个映射,将其作为指向函数的指针传递,但找不到访问元素的方法。代码如下: func refreshSession(sessions *map[string]Session) { now := time.Now() for sid := range *sessions { if now.After(*sessions[sid].timestamp.Add(sessionRefresh)) { delete( *sessions,

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

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[sid]
实际上意味着
*(session[sid])
,也就是说,首先索引指向map的指针(因此出现错误),然后取消对它的引用


您应该使用
(*session)[sid]。时间戳
首先取消对映射指针的引用,然后使用键访问它。

首先取消对映射的引用,然后访问它():


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

不需要将指针与映射一起使用

如果需要更改
会话
,可以使用指针:


map[string]*Session

我发现这种情况非常罕见。我试过了,效果很好。如果@jmaloney solutions适合您,您确定您使用的代码与您在此处发布的代码相同吗?我在代码中遇到了其他问题。所以它变了。我在上面的问题中更新了它。但是,在我去掉所有的*和&.问题之后,我第一次遇到的问题就消失了。问题是,在某些情况下,地图的键应该是x类型的指针吗?你的意思是像
map[*T]string
?像map[*T]string这样的东西可能吗?@harunrashid确实,看看这个示例map[string]*会话不会像原始代码那样全局修改映射
(*sessions)[sid]