指针的Do映射与使用映射的常见方式不同



我想用映射创建缓存。由于映射不允许引用其值,因此不可能更改被调用函数中的值。

经过一番搜索,我发现,创建(结构的(指针映射是可能的。它几乎可以解决问题,并且可以通过引用像变量一样工作但正如我发现的一些使用这种方法的地图。我担心为了安全使用它。有人有使用指针映射的经验吗?这是正确的使用方式吗?

package main
import "fmt"
type Cache struct {
    name    string
    counter int
}
func incr(c Cache) {
    c.counter += 1
}
func incrp(c *Cache) {
    c.counter += 2
}
func main() {
    m := make(map[string]Cache)
    m["james"] = Cache{name: "James", counter: 10}
    c := m["james"]
    incr(c)
    fmt.Println(c.name, c.counter) // James 10
    mp := make(map[string]*Cache)
    mp["james"] = &Cache{name: "James", counter: 10}
    cp := mp["james"]
    incrp(cp)
    fmt.Println(cp.name, cp.counter) // James 12
}

编辑:我的文本中有一些令人困惑的单词和句子,这导致了误解,所以我试图修复它

您可以实现这一点,并且仍然有一个非指针的map,结构上有一个指针接收器

package main
import "fmt"
type Cache struct {
    name    string
    counter int
}
func (c *Cache) incr() {    // the '(c *Cache)' is the receiver;
    c.counter += 1          // it makes incr() a method, not just a function
}
func main() {
    m := make(map[string]Cache)
    m["james"] = Cache{name: "James", counter: 10}
    c := m["james"]
    c.incr()
    fmt.Println(c.name, c.counter)
}

输出:

James 11

如果接收器方法对您来说是新的,下面是围棋教程中提到它们的地方:https://tour.golang.org/methods/1

请注意教程中几个步骤后的指针接收器页面:https://tour.golang.org/methods/4

最新更新