2013-03-04 13 views
6

間で共通のフィールドを処理する方法: 行く - 私は二つのタイプがある場合は、構造体の型

type A struct { 
     X int 
     Y int 
} 

type B struct { 
     X int 
     Y int 
     Z int 
} 

には二つの方法を必要とせずに次のことを達成するためにどのような方法が与えられた、あるの両方のアクセスはフィールドを同じ名前と返すことをそれらの合計?

func (a *A) Sum() int { 
    return a.X + a.Y 
} 

func (b *B) Sum() int { 
    return b.X + b.Y 
} 

もちろん、XとYの方法であったため、これら2つの方法を含むインターフェイスを定義できました。フィールドのアナログはありますか?

答えて

11

ABに埋め込みます。

type A struct { 
     X int 
     Y int 
} 

func (a *A) Sum() int { 
    return a.X + a.Y 
} 

type B struct { 
     *A 
     Z int 
} 

a := &A{1,2} 
b := &B{&A{3,4},5} 

fmt.Println(a.Sum(), b.Sum()) // 3 7 

http://play.golang.org/p/fjT9c-m_Lj

しかし、いや、フィールドのためのインターフェースがありません。メソッドのみ。

+0

私は、なぜAをBに直接埋め込むのではなく、Aにポインタを埋め込むことを選択したのか不思議です。 – carbocation

+1

@jpp:OPがポインタ受信機でメソッドを持っていたからといって、もっと明確になると思いました。また、場合によっては、 'B 'もポインタの代わりに値であるように、次のようにインタフェースとして渡そうとするような違いがあります。http://play.golang.org/p/k2e5saB7OIしかし、この例ではそう思わないでしょう。 –

関連する問題