为什么我的setter不在匿名struct字段上工作?

时间:2013-10-17 11:22:33

标签: struct go setter

我只是在学习Go,这是一些我无法理解的行为:

package main

import "fmt"

type Message interface {
    SetSender(sender string)
}

type message struct {
    sender string
}

type Join struct {
    message
    Channel string
}

func (m message) SetSender(sender string) {
    m.sender = sender
}

func main() {
    var msg Message
    msg = Join{}
    msg.SetSender("Jim")
    fmt.Printf("%s", msg)
}

这会打印{{} },因此SetSender调用似乎不会生效。我怀疑它是以某种方式在message的副本上运行,但我无法弄清楚这样的副本会来自何处。我尝试更改SetSender以对*message进行操作,但无法编译。

游乐场:http://play.golang.org/p/yNdnM1bfSG

也欢迎有关替代设计模式的建议。我有几种类型的消息(此处仅显示Join),但它们都有一些共同的字段(此处仅显示sender)。我想避免为每种消息类型编写和导出单独的构造函数,所以如果我可以继续导出类型本身就会很棒。

1 个答案:

答案 0 :(得分:4)

您应该使用指向消息的指针,而不是消息。

func (m *message) SetSender(sender string) {
    m.sender = sender
}

func main() {
    var msg Message
    msg = new(Join)
    msg.SetSender("Jim")
    fmt.Printf("%s", msg)
}

它将改变结构。 message上的函数更改了对象的副本,指向message的指针上的函数更改了对象。

http://golangtutorials.blogspot.com/2011/06/methods-on-structs.html