2013-03-04 6 views
6

Jeśli mam dwa typy:Go - jak radzić sobie wspólnych pól między struct typów

type A struct { 
     X int 
     Y int 
} 

type B struct { 
     X int 
     Y int 
     Z int 
} 

Czy istnieje jakiś sposób, aby osiągnąć następujące bez konieczności dwie metody, biorąc pod uwagę, że zarówno dostęp identycznie nazwany pól i zwraca ich suma?

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

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

Oczywiście były metody X i Y, mogłem zdefiniować interfejs zawierający te dwie metody. Czy istnieje odpowiednik dla pól?

Odpowiedz

11

Osadź A w 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

Ale nie, nie ma interfejs do pól. Tylko metody.

+0

Jestem ciekawy, dlaczego zdecydowałeś się umieścić wskaźnik na A w B, zamiast bezpośrednio osadzać A w B. Chcesz się podzielić? – carbocation

+1

@jpp: Tylko dlatego, że OP miał metodę na odbiorniku wskaźnika, więc pomyślałem, że będzie to bardziej przejrzyste. Również w niektórych przypadkach robi różnicę, np. Jeśli 'B' jest również wartością zamiast wskaźnika, i próbuje się go przekazać jako interfejs, jak na przykład: http://play.golang.org/p/k2e5saB7OI Ale to wydaje się mało prawdopodobne, biorąc pod uwagę ten przykład. –