gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:59:58 27 4
gpt4 key购买 nike

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com