这段代码工作正常,但用于调用该函数的临时变量感觉很笨重
package main
import "fmt"
type Foo struct {
name string
value int
}
// SetName receives a pointer to Foo so it can modify it.
func (f *Foo) SetName(name string) {
f.name = name
}
var users = map[string]Foo{}
func main() {
// Notice the Foo{}. The new(Foo) was just a syntactic sugar for &Foo{}
// and we don't need a pointer to the Foo, so I replaced it.
// Not relevant to the problem, though.
//p := Foo{}
users["a"] = Foo{value: 1}
x := users["a"]
x.SetName("Abc")
users["a"] = x
fmt.Println(users)
}
最佳答案
不幸的是没有。在 Go 中,通常 指针是透明的,当您在其上调用指针方法时,值会自动寻址。您设法找到了少数不存在的情况之一。这种情况是映射存储——映射中的值不被认为是可寻址的。也就是说,您永远不能执行 val := &map[key]
。
当您有一个值 val := Typ{}
和在 *Typ
上定义的方法时,当您尝试调用 val.Method()
Go 会 super secret 地执行 (&val).Method()
。既然你不能做 &map[key]
,那么这行不通,所以你做的临时变量 dance 是唯一的方法。
至于为什么会这样,map 的内部结构对用户来说有点保密,因为它是一个 hashmap,它保留重新分配自身、随机播放数据等的权利,允许您获取任何地址值(value)破坏了这一点。已经有人考虑允许这种特定情况起作用(即:调用一个带有指针接收器的方法),因为修复非常简单,但尚未被接受。有一天可能会允许,但不是现在。
关于go - 除了暂时将它们分配给变量之外,还有什么方法可以将方法绑定(bind)到 Go 映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22587690/