2013-03-04 6 views
6

zu handhaben, wenn ich zwei Typen haben:Go - wie gemeinsame Felder zwischen Strukturtypen

type A struct { 
     X int 
     Y int 
} 

type B struct { 
     X int 
     Y int 
     Z int 
} 

Gibt es eine Möglichkeit, die folgenden, ohne dass zwei Methoden, gegeben zu erreichen, dass beide Zugriff identisch genannten Felder und kehrt die Summe von ihnen?

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

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

Natürlich waren X und Y Methoden konnte ich eine Schnittstelle enthält, diese beiden Methoden definieren. Gibt es ein Analogon für Felder?

Antwort

11

Einbetten A in B.

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

Aber nein, gibt es keine Schnittstelle für die Felder. Nur Methoden.

+0

Ich bin gespannt, warum Sie ausgewählt haben, einen Zeiger auf A in B einzubetten, anstatt A direkt in B einzubetten. Care to share? – carbocation

+1

@jpp: Nur weil OP die Methode auf einem Zeigerempfänger hatte, so dachte ich, es wäre klarer. In einigen Fällen macht es auch einen Unterschied, ob "B" auch ein Wert anstelle eines Zeigers ist und versucht wird, als Schnittstelle übergeben zu werden, so: http://play.golang.org/p/k2e5saB7OI Aber das scheint bei diesem Beispiel nicht wahrscheinlich. –

Verwandte Themen