2016-12-03 17 views
6

मैं गो फॉर गो में एक पार्सर लिख रहा हूं, और इसका परीक्षण करने के लिए मैंने जिथब परियोजनाओं से फाइलों का एक समूह डाउनलोड किया। एक समारोह तर्क है, जो अंदर से संदर्भ के लिए यह असंभव बना देता है के रूप में एक नाम के बिनाअज्ञात तर्क एक चीज है?

func moveLabel(*Button) { 
    from := movingCurrent 
    to := 0 
    if from == 0 { 
     to = 1 
    } 
    movingBoxes[from].Delete(0) 
    movingBoxes[to].Append(movingLabel, false) 
    movingCurrent = to 
} 

यह मुझे एक Button के लिए सूचक को देखने के लिए थोड़ा भ्रमित:
https://github.com/andlabs/ui में मैं कोड के इस टुकड़े वाली फ़ाइल से टकरा कार्यक्रम।
हालांकि, यह वाक्य रचनात्मक रूप से सही लगता है कि संकलक शिकायत नहीं करता है।
गो में अनमोल फ़ंक्शंस तर्कों का उद्देश्य क्या है?

+0

जोड़ा अधिक विवरण, विवरण (कल्पना के आधार पर) और लिंक जवाब के लिए। – icza

उत्तर

8

अनाम पैरामीटर पूरी तरह से मान्य हैं। Parameter declaration कल्पना से:

ParameterDecl = [ IdentifierList ] [ "..." ] Type . 

आप देख सकते हैं, IdentifierList (पहचानकर्ता नाम या नाम), वर्ग कोष्ठक में है जो इसे वैकल्पिक है का मतलब है। केवल Type आवश्यक है।

इसका कारण यह है कि किसी विधि या फ़ंक्शन को कॉल करने वाले व्यक्ति के लिए नाम वास्तव में महत्वपूर्ण नहीं हैं। पैरामीटर के प्रकार और उनके आदेश क्या मायने रखता है। यह इस उत्तर में विस्तृत है: Getting method parameter names in Golang

आम तौर पर आप चर और पैरामीटर का नाम देते हैं ताकि आप उन्हें संदर्भित कर सकें।

जब आप कुछ नाम नहीं देते हैं, तो ऐसा इसलिए होता है क्योंकि आप इसका उल्लेख नहीं करना चाहते हैं।

तो सवाल यह होना चाहिए: मैं पैरामीटर का संदर्भ क्यों नहीं देना चाहूंगा?

उदाहरण के लिए, क्योंकि पैरामीटर "है वहाँ" (यह पारित हो जाता है), लेकिन आप इसे की जरूरत नहीं है, आप इसे उपयोग करने के लिए नहीं करना चाहती। अगर मुझे इसकी आवश्यकता नहीं है तो ऐसा क्यों होगा?

क्योंकि कोई या कुछ विशिष्ट मानकों के लिए को निर्देशित करता है। उदाहरण के लिए आप एक इंटरफ़ेस को कार्यान्वित करना चाहते हैं, या आप एक फ़ंक्शन वैल्यू पास करना चाहते हैं जिसका हस्ताक्षर फ़ंक्शन प्रकार द्वारा परिभाषित किया गया है।

चलो एक उदाहरण देखें।

type MyWriter interface { 
    Write(p []byte) error 
} 

एक सरलीकृत io.Writer जो केवल एक त्रुटि देता है, लेकिन लिखित बाइट की संख्या रिपोर्ट नहीं करता: हम निम्नलिखित MyWriter इंटरफ़ेस होता है। आप एक कार्यान्वयन जो सिर्फ डेटा (ioutil.Discard के समान) को छोड़ देता है प्रदान करना चाहते हैं चाहते हैं, तो कार्यान्वयन का उपयोग नहीं करता है (उपयोग करने की आवश्यकता नहीं है) ने अपने तर्क:

type DiscardWriter struct{} 

func (DiscardWriter) Write([]byte) error { return nil } 

और बस इतना ही है: हम डॉन ' रिसीवर का उपयोग नहीं करते, हम तर्क का उपयोग नहीं करते हैं। दोनों को अनामित किया जा सकता है। और कार्यान्वयन ठीक वही करता है जो इसे करना चाहिए।

ऐसा करने (अनामित पैरामीटर का उपयोग करके) दस्तावेज़ कि मान का उपयोग नहीं किया जाता/संदर्भित किया जाता है।

एक और कारण आगे संगतता प्रदान करने के लिए हो सकता है। यदि आप लाइब्रेरी जारी करते हैं, तो आप पीछे संगतता को तोड़ने के बिना पैरामीटर सूची को बदल या विस्तार नहीं कर सकते हैं (और गो में कोई फ़ंक्शन ओवरलोडिंग नहीं है: यदि आप अलग-अलग पैरामीटर वाले 2 प्रकार चाहते हैं, तो उनके नाम भी अलग होना चाहिए)। तो आप अतिरिक्त पैरामीटर के साथ एक निर्यातित फ़ंक्शन या विधि घोषित कर सकते हैं, लेकिन चूंकि आप अभी तक उनका उपयोग नहीं करते हैं, इसलिए आप उन्हें अनामित छोड़ सकते हैं। इसका एक उदाहरण इस उत्तर में विस्तृत है: Why does Go allow compilation of unused function parameters?

यहां ध्यान देने योग्य एक बात यह है कि आप नाम और अज्ञात पैरामीटर मिश्रण नहीं कर सकते हैं। यदि आप कुछ नाम देते हैं, तो आपको सभी का नाम देना होगा। आप सभी की जरूरत नहीं है, तो आप इस उदाहरण की तरह blank identifier उपयोग कर सकते हैं:

एक सरल वेब सर्वर जो सभी अनुरोधों का "Hello" पाठ के साथ प्रतिक्रिया:

http.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) { 
    io.WriteString(w, "Hello") 
}) 
panic(http.ListenAndServe(":8080", nil)) 

हैंडलर समारोह "Hello" वापस भेजने पाठ केवल प्रतिक्रिया लेखक w का उपयोग करता है, लेकिन अनुरोध संरचना नहीं, इसलिए रिक्त पहचानकर्ता का नाम इसके नाम के रूप में उपयोग किया जाता है।

एक अन्य संबंधित प्रश्न:

Why must we declare a variable name when adding a method to a struct in Golang?

इसके अलावा कुछ हद तक संबंधित है, लेकिन के बारे में उपयोग करते हुए/नामकरण लौटे मान:

Return map like 'ok' in Golang on normal functions

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