猿问

除了暂时将方法分配给变量之外,还有什么方法可以将方法绑定到 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


回首忆惘然
浏览 177回答 2
2回答

慕雪6442864

抱歉不行。在 Go 中,指针通常是透明的,当你对它们调用指针方法时,值会自动寻址。您设法找到了少数没有的情况之一。这种情况是地图存储——地图中的值不被认为是可寻址的。也就是说,你永远做不到val := &map[key]。当你val := Typ{}定义了一个值和方法时*Typ,当你尝试调用val.Method()Go 时会超级偷偷地做(&val).Method()。既然你不能做&map[key],那么这不起作用,所以你做的临时可变舞蹈是唯一的方法。至于为什么会这样,地图的内部结构对于用户来说被认为有点秘密,因为它是一个哈希图,它保留重新分配自身、随机数据等的权利,允许您获取任何破坏该地址的值的地址. 已经考虑过允许这种特定情况起作用的建议(即:调用带有指针接收器的方法),因为修复非常简单,但尚未被接受。也许有一天会被允许,但不是现在。
随时随地看视频慕课网APP

相关分类

Go
我要回答