2013-01-01 9 views
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インターフェイスの実装と似ています。

答えて

6

いいえ、メソッドは、同じパッケージに定義されている名前付きの型にのみ取り付けることができます。 specsから:

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

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

レシーバタイプは、フォームTまたは* Tは、タイプ名Tでなければなりません。 Tで示されるタイプは、受信機ベースタイプと呼ばれます。それはポインタまたはインタフェース型であってはならず、メソッドと同じパッケージ内で宣言されなければなりません。このメソッドは基本型にバインドされていると言われ、メソッド名はその型のセレクタ内でしか見ることができません。

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

関連する問題