I'm just learning Go, and here's some behaviour I can't quite get my head around:
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)
}
This prints {{} }
, so the SetSender
call doesn't seem to take effect. I suspect that it is somehow operating on a copy of the message
, but I can't figure out where such a copy would come from. I tried changing SetSender
to operate on *message
but that won't compile.
Playground: http://play.golang.org/p/yNdnM1bfSG
Suggestions for alternative design patterns are also welcome. I have several types of messages (only Join
is shown here), but they all have some fields in common (only sender
is shown here). I'd like to avoid having to write and export a separate constructor for each message type, so it would be great if I can just keep exporting the types themselves.