这段代码工作正常,但用于调用该函数的临时变量感觉很笨重package mainimport "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)}http://play.golang.org/p/vAXthNBfdP
2 回答
慕雪6442864
TA贡献1812条经验 获得超5个赞
抱歉不行。在 Go 中,指针通常是透明的,当你对它们调用指针方法时,值会自动寻址。您设法找到了少数没有的情况之一。这种情况是地图存储——地图中的值不被认为是可寻址的。也就是说,你永远做不到val := &map[key]
。
当你val := Typ{}
定义了一个值和方法时*Typ
,当你尝试调用val.Method()
Go 时会超级偷偷地做(&val).Method()
。既然你不能做&map[key]
,那么这不起作用,所以你做的临时可变舞蹈是唯一的方法。
至于为什么会这样,地图的内部结构对于用户来说被认为有点秘密,因为它是一个哈希图,它保留重新分配自身、随机数据等的权利,允许您获取任何破坏该地址的值的地址. 已经考虑过允许这种特定情况起作用的建议(即:调用带有指针接收器的方法),因为修复非常简单,但尚未被接受。也许有一天会被允许,但不是现在。
- 2 回答
- 0 关注
- 176 浏览
添加回答
举报
0/150
提交
取消