2014-05-15 9 views
8

निम्न कोड ठीक काम करता है। दो तरीकों दो अलग structs पर काम और struct के एक क्षेत्र मुद्रण: अगर मैं निम्नलिखित में विधि हस्ताक्षर बदलने के लिए,गोलांग विधियों के समान नाम और धर्मार्थता, लेकिन विभिन्न प्रकार

A 
B 

अब:

type A struct { 
    Name string 
} 

type B struct { 
    Name string 
} 

func (a *A) Print() { 
    fmt.Println(a.Name) 
} 

func (b *B) Print() { 
    fmt.Println(b.Name) 
} 

func main() { 

    a := &A{"A"} 
    b := &B{"B"} 

    a.Print() 
    b.Print() 
} 

कंसोल में वांछित आउटपुट दिखाता है जिस तरह से मुझे एक संकलन त्रुटि मिलती है।

./test.go:22: Print redeclared in this block 
    previous declaration at ./test.go:18 
./test.go:40: cannot use a (type *A) as type *B in function argument 

प्रश्न:

func Print(a *A) { 
    fmt.Println(a.Name) 
} 

func Print(b *B) { 
    fmt.Println(b.Name) 
} 

func main() { 

    a := &A{"A"} 
    b := &B{"B"} 

    Print(a) 
    Print(b) 
} 

मैं भी कार्यक्रम संकलन नहीं कर सकता: मैं बस विधि के तर्कों को विधि के रिसीवर के लिए कदम क्यों यह, कि मैं अदला-बदली कर सकते हैं रिसीवर में संरचना प्रकार, लेकिन तर्कों में नहीं, जब विधियों के समान नाम और arity है?

उत्तर

22

क्योंकि गो उपयोगकर्ता द्वारा परिभाषित कार्यों को उनके तर्क प्रकारों पर अधिभारित करने का समर्थन नहीं करता है।

आप केवल विधियों, स्विच, प्रकार स्विच और चैनलों के माध्यम से बहुरूपता प्राप्त कर सकते हैं।

+1

धन्यवाद। बस इसे मिला: http://golang.org/doc/faq#overloading – Kiril

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