1

我只是在学习围棋,这里有一些我无法理解的行为:

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

4

1 回答 1

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

于 2013-10-17T11:25:43.363 回答