1

私は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ここにのみ表示されます)。メッセージの種類ごとに個別のコンストラクターを作成してエクスポートする必要がないようにしたいので、型自体をエクスポートし続けることができれば素晴らしいと思います。

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 に答える