2013-03-04 13 views
6

arasındaki ortak alanları nasıl ele: Git - İki türleri varsa yapı tipleri

type A struct { 
     X int 
     Y int 
} 

type B struct { 
     X int 
     Y int 
     Z int 
} 

iki yöntem gerek kalmadan aşağıdaki ulaşmak için herhangi bir yolu göz önüne alındığında, var mı hem erişim alanlarını aynı adlı ve dönmek olduğunu bunların toplamı?

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

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

Elbette X ve Y yöntemleriydi, bu iki yöntemi içeren bir arabirim tanımlayabilirim. Alanlar için bir analog var mı?

cevap

11

B numaralı belgeye A gönderin.

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

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 
Ama hayır, alanlar için hiçbir arayüz var. Sadece yöntemleri.

+0

A'yı B'ye doğrudan yerleştirmekten ziyade A'ya A işaretçisini yerleştirmeyi neden seçtiğinizi merak ediyorum. Paylaşmak için dikkat etmek ister misiniz? – carbocation

+1

@jpp: Sadece OP bir gösterici alıcı üzerinde bir yöntem vardı, bu yüzden daha açık olacağını düşündüm. Ayrıca bazı durumlarda, B 'bir işaretçi yerine bir değer ise ve bir arabirim olarak geçilmeye çalışılırsa, bir fark yaratır: http://play.golang.org/p/k2e5saB7OI Ancak Bu örnek verilen olası görünmüyor. –