我只是在学习围棋,这里有一些我无法理解的行为:
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
在此处显示)。我想避免为每种消息类型编写和导出单独的构造函数,所以如果我可以继续导出类型本身会很棒。