2013-06-04 9 views
5

अज्ञात फ़ील्ड (या सुपरक्लास) का उपयोग करके मैं संरचना का सही प्रकार कैसे प्राप्त करूं?गो में, मैं अज्ञात फ़ील्ड विधि का उपयोग कर टाइपऑफ प्रकार कैसे प्राप्त कर सकता हूं?

मैं इस मछली एक कॉड के रूप में खुद का वर्णन करने के लिए कोशिश कर रहा हूँ:

package main 

import (
    "fmt" 
    "reflect" 
) 

type Fish struct { 
} 

func (self *Fish) WhatAmI() string { 
    return reflect.TypeOf(self).String() 
} 

type Cod struct { 
    Fish 
} 

func main() { 
    c := new(Cod) 
    fmt.Println("I am a", c.WhatAmI()) 
} 

उत्पादन मैं मिलता है:

I am a *main.Fish 

क्या मैं चाहता हूँ है:

I am a *main.Cod 

उत्तर

9

आप सही उत्तर प्राप्त कर रहे हैं। उत्तर पाने के लिए आपको उत्तर चाहिए।

में
func (f *Fish) WhatAmI() string { 
     return reflect.TypeOf(f).String() 
} 

fप्रकार *main.Fish की है, तो यह और भी घोषित है कि प्रकार (f *Fish) का होना। इस प्रकार यह कभी भी *main.Cod प्रकार का नहीं हो सकता है।

भ्रम का संभावित स्रोत: Cod का विधि सेट इसके एम्बेडेड, गुमनाम फ़ील्ड Fish के विधि सेट को विरासत में रखता है और इसे ओवरराइड नहीं करता है। के उदाहरण पर WhatAmI का आविष्कार Fish.WhatAmI, पर कॉल करें, लेकिन रिसीवर अब *main.Fish प्रकार का एम्बेडेड फ़ील्ड है।

विरासत में मिला विधि अधिभावी साथ

उदाहरण:

package main 

import (
     "fmt" 
) 

type Fish struct { 
} 

func (f *Fish) WhatAmI() string { 
     return fmt.Sprintf("%T", f) 
} 

type Cod struct { 
     Fish 
} 

func (c *Cod) WhatAmI() string { 
     return fmt.Sprintf("%T", c) 
} 

func main() { 
     c := new(Cod) 
     fmt.Println("I am a", c.WhatAmI()) 
} 

Playground


आउटपुट:

I am a *main.Cod 
2

एक काफी सामान्य समाधान के लिए, आप WhatAmI समारोह Fish से अलग कर सकता एक खाली इंटरफ़ेस टाइप करें और उपयोग करें (Andrew Gerrand's "The Laws of Reflection" देखें), और सिर्फ इतना है कि पर प्रकार की जांच:

package main 

import (
    "fmt" 
    "reflect" 
) 

type Fish struct { 
} 

type Cod struct { 
    Fish 
} 

func WhatAmI (self interface{}) string { 
    return reflect.TypeOf(self).String() 
} 

func main() { 
    c := new(Cod) 
    fmt.Println("I am a", WhatAmI(c)) 
} 

देता है:

I am a *main.Cod 
+0

लक्ष्य 'Fish' पर तरीकों से प्रकार पता करने के लिए है, तो उस में मदद नहीं करेगा: उन तरीकों के लिए रिसीवर एक 'मछली' होगा, भले ही इसे किसी अन्य संरचना में एम्बेड किया गया हो। –

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

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