2013-03-04 6 views
6

के बीच आम क्षेत्रों को संभालने के लिए अगर मैं दो प्रकार के होते हैं:जाओ - कैसे struct प्रकार

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 
} 

बेशक, एक्स और वाई विधियां थीं, मैं इन दो विधियों वाले इंटरफ़ेस को परिभाषित कर सकता था। क्या खेतों के लिए कोई एनालॉग है?

उत्तर

11

में A एम्बेड करें।

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

मुझे यह जानकर उत्सुकता है कि आपने ए में बी को सीधे एम्बेड करने के बजाए ए में बी को पॉइंटर एम्बेड करना क्यों चुना है। साझा करने के लिए देखभाल? – carbocation

+1

@jpp: सिर्फ इसलिए कि ओपी के पास पॉइंटर रिसीवर पर विधि थी, इसलिए मैंने सोचा कि यह और अधिक स्पष्ट होगा। इसके अलावा कुछ मामलों में यह एक फर्क पड़ता है, जैसे कि 'बी' सूचक के बजाय भी एक मान है, और इसे इंटरफेस के रूप में पारित करने का प्रयास किया जाता है: http://play.golang.org/p/k2e5saB7OI लेकिन ऐसा लगता है कि यह उदाहरण संभवतः नहीं दिया गया है। –

संबंधित मुद्दे