首页 文章

Golang:使用其引用访问 Map

提问于
浏览
18

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

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)

我试过括号,但没有效果 . 如果我带走所有引用运算符(*&),那么它编译得很好 .

我该怎么写这个?

3 回答

  • 9

    您不需要使用带有 Map 的指针 .

    Map 类型是引用类型,如指针或切片[1]

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

    map[string]*Session

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

  • 33

    首先取消引用 Map ,然后访问它:

    (*sessions)[sid]
    

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

  • 9

    您没有考虑 * 的优先顺序 .

    *session[sid] 实际上意味着 *(session[sid]) ,即首先将指针指向map(因此错误),然后解除引用它 .

    您应该使用 (*session)[sid].timestamp 首先取消引用指向 Map 的指针,然后使用该键访问它 .

相关问题