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

标签 go

这段代码工作正常,但用于调用该函数的临时变量感觉很笨重

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)
}

http://play.golang.org/p/vAXthNBfdP

最佳答案

不幸的是没有。在 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/

相关文章:

go - JetBrains Gogland :A fatal error has been detected by the Java Runtime Environment:A fatal error has been detected by the Java Runtime Environment:

macos - 使用Golang访问数据库时出现架构错误

mongodb - 在 ObjectId 字段上的两个集合之间进行 $lookup 查询

go - pprof 配置文件与 julienschmidtrouter 和基准测试不分析处理程序

go - 问题解析yaml文件

json - 如何使用 Go 将具有不同类型的一个元素的数组编码为 JSON?

json - 访问必要的字段 json golang

go - 如何以正确的方式组织你的 Go 项目?

GoLang : net. LookupHost 返回重复的 ip

go - 我可以在 slice 中内联声明接口(interface)列表吗?