5

JSON をデコードするときは、次のように親構造体の個々のオブジェクトに Stringer インターフェイスを実装できるように、常に各オブジェクトの構造体を明示的に記述しました。

type Data struct {
    Records []Record
}

type Record struct {
    ID int
    Value string
}

func (r Record) String() string {
    return fmt.Sprintf("{ID:%d Value:%s}", r.ID, r.Value)
}

最近、無名構造体をネストできることを知りました。このメソッドは、デコードされるデータの構造を定義するためにより簡潔です。

type Data struct {
    Records []struct {
        ID int
        Value string
    }
}

しかし、構造体のメンバー、特に匿名構造体のメンバーでメソッドを定義することは可能ですか? 最初のコード ブロックの Stringer インターフェイスの実装と同様です。

4

1 に答える 1

6

いいえ、メソッドは同じパッケージで定義された名前付きの型にのみアタッチできます。仕様から:

 メソッドはレシーバーを持つ関数です。メソッド宣言は、識別子 (メソッド名) をメソッドにバインドします。また、メソッドをレシーバーの基本型に関連付けます。

MethodDecl   = "func" Receiver MethodName Signature [ Body ] .
Receiver     = "(" [ identifier ] [ "*" ] BaseTypeName ")" .
BaseTypeName = identifier .

受信側の型は、T または *T の形式である必要があります。ここで、T は型名です。T で示される型は、レシーバーの基本型と呼ばれます。ポインターまたはインターフェイス型であってはならず、メソッドと同じパッケージで宣言する必要があります。メソッドは基本型にバインドされていると言われ、メソッド名はその型のセレクター内でのみ表示されます。

2 番目の OP の例のフィールドの型はRecords、型リテラルを使用して定義されます。上記の「タイプ名」条件が満たされていません。

于 2013-01-01T13:40:07.587 に答える