2012-10-16 13 views
6

गो एक व्यक्ति को जिस संरचना/डेटाटाइप पर काम करता है उससे अलग तरीके से परिभाषित करने की अनुमति देता है। क्या इसका अर्थ है विधि परिभाषाओं या कुछ और रखने में लचीलापन?संरचना विधियों से दूर जाने के तरीकों को परिभाषित करने का क्या फायदा है?

मैंने सुना है कि बंदर की संरचना/विधियों की प्रणाली बंदर पैचिंग की तुलना में की जा रही है, लेकिन यदि मैं सही ढंग से समझता हूं, तो आप वास्तव में किसी भी मौजूदा प्रकार (संरचना) में विधियों को नहीं जोड़ सकते हैं, क्योंकि विधियों को उसी पैकेज में अवश्य रहना चाहिए प्रकार। अर्थात। आप बंदर पैच केवल वही प्रकार कर सकते हैं जो आपके नियंत्रण में हैं। या क्या मैं कुछ न कुछ भूल रहा हूं?

किस मामले में आप अलग-अलग स्रोत फ़ाइलों (या उसी स्रोत फ़ाइल के विभिन्न हिस्सों में) में एक प्रकार और इसकी विधियों को परिभाषित करेंगे?

उत्तर

9

इस से अधिक प्रकार के आधार पर भाषाओं जाओ का एक फायदा है: आप के रूप में आप की तरह अपने फ़ाइलों को व्यवस्थित कर सकते हैं: भले ही वहाँ कई प्रकार के होते हैं रिसीवर

  • आप सभी समान कार्य एक साथ रख सकते हैं,
  • आप
  • एक फ़ाइल को विभाजित कर सकते हैं जो अन्यथा बहुत बड़ा होगा

अक्सर, गो ने एक बाधा नहीं जोड़ा जो बेकार था। तो जवाब भी हो सकता है "क्यों नहीं"?

तुम सच में किसी भी मौजूदा प्रकार (struct) करने के तरीकों को नहीं जोड़ सकते, के रूप में तरीकों प्रकार

रूप में एक ही पैकेज का निवासी होना आवश्यक आप, आप जो समारोह निर्धारित करने में सक्षम नहीं हो सकता है हो सकता है दो अलग-अलग पैकेजों में एक ही संरचना पर इस्तेमाल किए गए एक ही फ़ंक्शन नाम के मामले में कॉल करने के लिए। या इससे कुछ संकुल असंगत होंगे।

6

बंदर पैचिंग जाने में संभव नहीं है। जिस तरीके से आप विधियों को परिभाषित करते हैं, उसी पैकेज में रहना चाहिए।

आप जो भी कर सकते हैं वह पैकेज और अंदर के तरीकों को परिभाषित करना है जहां आप पैकेज के अंदर चाहें। यह वास्तव में कोई फर्क नहीं पड़ता कि टाइप परिभाषा उसी फ़ाइल में है जो प्रकार की विधि परिभाषा के रूप में है।

इससे एक फ़ाइल में सभी प्रकार की परिभाषाओं को समूहित करना संभव हो जाता है और विधि में कार्यान्वयन हो सकता है। संभावित रूप से अन्य सहायक के साथ जो विधियों द्वारा आवश्यक हैं।

7

यह वह जगह है (आंशिक रूप से, शायद) जाओ में क्योंकि, आप पर तरीकों किसी भी प्रकार, न सिर्फ struct हो सकता है:

type Age uint 

func (a Age) Add(n Age) Age { 
    return a + n 
} 

यह आपके द्वारा किसी मौजूदा प्रकार के तरीकों में जोड़ सकते हैं भी है। आप जो करते हैं वह उस मौजूदा प्रकार के आधार पर एक नया प्रकार परिभाषित करता है, और अपनी पसंद के तरीकों को जोड़ता है।

+0

मुझे नहीं लगता कि यह मौजूदा प्रकार के तरीकों को कैसे जोड़ रहा है - मौजूदा प्रकार यहां "uint" है और यदि मैं सही ढंग से समझता हूं "जोड़ें" "uint" के साथ काम नहीं करेगा। – Aivar

+0

हाँ, मैंने एक शॉर्टकट लिया, आप अपने पैकेज के बाहर किसी प्रकार के तरीके को विधि नहीं जोड़ सकते हैं, लेकिन आप मौजूदा प्रकार के आधार पर एक नया प्रकार परिभाषित कर सकते हैं और इस प्रकार के तरीकों को जोड़ सकते हैं। इन तरीकों का उपयोग करने के लिए आधार प्रकार को अपने संवर्धित प्रकार में डालने के लिए तुच्छ है (उदाहरण के लिए क्या लेखकों ने स्ट्रिंगस्लाइस प्रकार के साथ सॉर्ट पैकेज में किया था)। – mna