我只是在学习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
)。我想避免为每种消息类型编写和导出单独的构造函数,所以如果我可以继续导出类型本身就会很棒。
答案 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