为了账号安全,请及时绑定邮箱和手机立即绑定

除了暂时将方法分配给变量之外,还有什么方法可以将方法绑定到 Go 映射?

除了暂时将方法分配给变量之外,还有什么方法可以将方法绑定到 Go 映射?

Go
回首忆惘然 2021-07-30 07:38:05
这段代码工作正常,但用于调用该函数的临时变量感觉很笨重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],那么这不起作用,所以你做的临时可变舞蹈是唯一的方法。

至于为什么会这样,地图的内部结构对于用户来说被认为有点秘密,因为它是一个哈希图,它保留重新分配自身、随机数据等的权利,允许您获取任何破坏该地址的值的地址. 已经考虑过允许这种特定情况起作用的建议(即:调用带有指针接收器的方法),因为修复非常简单,但尚未被接受。也许有一天会被允许,但不是现在。


查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信