2013-01-01 47 views
5

जब JSON डिकोडिंग मैं हमेशा स्पष्ट रूप से प्रत्येक वस्तु के लिए एक struct लिखा है ताकि मैं तो जैसे एक माता पिता struct में अलग-अलग वस्तुओं के लिए स्ट्रिंगर इंटरफ़ेस को लागू कर सकते हैं:प्रकार का एक struct मैदान पर विधि एक प्रकार शाब्दिक द्वारा परिभाषित

type Data struct { 
    Records []Record 
} 

type Record struct { 
    ID int 
    Value string 
} 

func (r Record) String() string { 
    return fmt.Sprintf("{ID:%d Value:%s}", r.ID, r.Value) 
} 

मैंने हाल ही में सीखा है कि अज्ञात structs के साथ घोंसला करना संभव है। इस विधि बहुत अधिक डेटा की संरचना को परिभाषित करने डीकोड किया जा करने के लिए के लिए संक्षिप्त है:

type Data struct { 
    Records []struct { 
     ID int 
     Value string 
    } 
} 

लेकिन, यह एक struct, विशेष रूप से एक सदस्य जो एक गुमनाम struct है के एक सदस्य पर एक विधि को परिभाषित करना संभव है? पहले कोड ब्लॉक में स्ट्रिंगर इंटरफ़ेस कार्यान्वयन की तरह।

उत्तर

6

नहीं, विधियों को केवल उसी पैकेज में परिभाषित नामित प्रकारों से जोड़ा जा सकता है। specs से:

एक विधि एक रिसीवर के साथ एक कार्य है। एक विधि घोषणा एक विधि के लिए एक पहचानकर्ता, विधि नाम, बांधता है। यह विधि को रिसीवर के बेस प्रकार से भी जोड़ता है।

MethodDecl = "func" Receiver MethodName Signature [ Body ] . 
Receiver  = "(" [ identifier ] [ "*" ] BaseTypeName ")" . 
BaseTypeName = identifier . 

रिसीवर प्रकार या रूप टी का होना चाहिए * टी जहां टी एक प्रकार का नाम है। टी द्वारा निर्दिष्ट प्रकार को रिसीवर बेस प्रकार कहा जाता है; यह एक सूचक या इंटरफ़ेस प्रकार नहीं होना चाहिए और इसे विधि के समान पैकेज में घोषित किया जाना चाहिए। विधि को बेस प्रकार से बाध्य कहा जाता है और विधि का नाम केवल उस प्रकार के चयनकर्ताओं के भीतर दिखाई देता है।

दूसरे ओपी उदाहरण में Records फ़ील्ड का प्रकार एक प्रकार का शाब्दिक, यानी उपयोग करके परिभाषित किया गया है। ऊपर 'प्रकार का नाम' स्थिति पूरी नहीं हुई है।