फ़ंक्शन घोषणा सिंटैक्स: फ़ंक्शन नाम से पहले कोष्ठक में चीजें


249

मुझे खेद है कि मैं प्रश्न शीर्षक में अधिक विशिष्ट नहीं हो सकता, लेकिन मैं कुछ गो कोड पढ़ रहा था और मुझे इस फॉर्म की घोषणाओं का सामना करना पड़ा:

func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    ...
}

से https://github.com/mattermost/platform/blob/master/api/context.go

func (s *GracefulServer) BlockingClose() bool {
    ...
}

से https://github.com/braintree/manners/blob/master/server.go

कोष्ठक (h handler)के (s *GracefulServer)बीच और क्या मतलब है? कोष्ठक के बीच की चीजों के अर्थ को ध्यान में रखते हुए, पूरे फ़ंक्शन घोषणा का क्या मतलब है?

संपादित करें

यह व्हाट्सएप के गो और फ़ंक्शंस के तरीकों का अंतर नहीं है? : यह प्रश्न मेरे पास आया क्योंकि मुझे नहीं पता था कि फ़ंक्शन नाम से पहले कोष्ठक में क्या चीजें थीं, इसलिए नहीं कि मैंने सोचा कि कार्यों और विधियों के बीच क्या अंतर था ... अगर मुझे पता था कि यह घोषणा एक ऐसी विधि है जो मैं करूँगा ' टी में यह सवाल पहले स्थान पर था। यदि किसी को एक दिन मेरे समान संदेह है, तो मुझे विश्वास नहीं है कि वह "गोलंग विधियों" की खोज करेगी क्योंकि वह नहीं जानती है कि यह मामला है। यह आश्चर्यचकित करने जैसा होगा कि गणितीय अभिव्यक्ति से पहले अक्षर "सिग्मा" का अर्थ क्या है (यह नहीं जानते कि इसका मतलब है संक्षेपण) और किसी का कहना है कि यह दोहराव है कि क्या अंतर और कुछ अन्य बातों के बीच अंतर है।

साथ ही, इस प्रश्न का संक्षिप्त उत्तर ("यह एक रिसीवर है") "कार्यों और विधियों के बीच अंतर क्या है" का कोई जवाब नहीं है।


27
@ वोल्कर ने यह कहते हुए एक डिस्क्लेमर डाल दिया कि स्टैकओवरफ्लो पर गो लोग केवल उन सवालों के जवाब देते हैं जो गो टूर पर नहीं हैं। हास्केल समुदाय में, लोग प्रश्न पूछ सकते हैं कि हास्केल में सूची से मैं कैसे nतत्व प्राप्त कर सकता हूं ? , जो कि ग्रेट गुड के लिए हस्केल ऑन लाईक पर परिचय में है और इसके बारे में किए गए उपद्रव के बिना उनके सवालों का जवाब मिलता है।
मार्कस विनीसियस मोंटेइरो

23
जब मेरा यह सवाल था, तो मैं पहली बार गो टूर पर गया। मैंने सभी "फ़ंक्शन" शीर्षक की जाँच की और किसी भी उदाहरण ने इसे कवर नहीं किया। tour.golang.org/basics/4 tour.golang.org/basics/5 यदि आप मेथड्स और इंटरफेस का विस्तार करना नहीं जानते हैं, तो आपको "Methods are functions" टाइटल दिखाई नहीं देगा। यह प्रश्न Google अनुक्रमण के लिए एक वैध और महान प्रश्न है। डुप्लिकेट ध्वज ध्वज को हल्का करने की आवश्यकता है।
ब्रूनो ब्रोंस्की

14
आपके प्रश्न में विशिष्ट नहीं होने के लिए धन्यवाद, क्योंकि यह मुझे उत्तर खोजने में मदद करने के लिए पर्याप्त था!
डेविड के

1
आपने ठीक वही पूछा जो मैंने खोजा था, इसका वैध प्रश्न। धन्यवाद। मैंने सभी प्रकार की फ़ंक्शन परिभाषा पढ़ी और किसी ने भी इसे नहीं समझाया। मैंने अभी भी अपने घन प्रश्न लिखने की कोशिश की और यह पाया।
अजाक 6

जवाबों:


200

इसे 'रिसीवर' कहा जाता है। पहले मामले में (h handler)यह एक मूल्य प्रकार है, दूसरे में (s *GracefulServer)यह एक सूचक है। गो में काम करने का तरीका कुछ अन्य भाषाओं से थोड़ा भिन्न हो सकता है। हालाँकि, प्राप्त करने का प्रकार अधिकांश ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में एक वर्ग की तरह कम या ज्यादा काम करता है। यह वह विधि है जिसे आप विधि कहते हैं, जैसे कि अगर मैंने कुछ विधि Aको किसी वर्ग में रखा है Personतो मुझे Personकॉल करने के लिए एक प्रकार की आवृत्ति की आवश्यकता होगी A(यह एक उदाहरण विधि है और स्थिर नहीं है!)।

एक गट्टा यह है कि रिसीवर अन्य तर्कों की तरह कॉल स्टैक पर धकेल दिया जाता है, इसलिए यदि रिसीवर एक मूल्य प्रकार है, जैसे कि handlerतब मामले में आप उस चीज़ की एक कॉपी पर काम कर रहे होंगे जिसे आपने विधि कहा है, जैसे h.Name = "Evan"कि कुछ से। आपके द्वारा कॉलिंग स्कोप में वापस आने के बाद न रहें। इस कारण से जो कुछ भी रिसीवर की स्थिति को बदलने की उम्मीद करता है, उसे एक पॉइंटर का उपयोग करने या संशोधित मूल्य वापस करने की आवश्यकता होती है (यदि आप उस की तलाश कर रहे हैं तो एक अपरिवर्तनीय प्रकार के प्रतिमान अधिक देता है)।

यहाँ कल्पना से संबंधित अनुभाग है; https://golang.org/ref/spec#Method_sets


6
प्रासंगिक व्याख्या से जोड़ने के लिए अच्छी व्याख्या और अतिरिक्त कर्म अंक
मारियस वाल्डल

4
गोलंग दौरे के कुछ बहुत उपयोगी उदाहरण भी हैं। goolang.org/methods/1
tw_hoff

90

इसका मतलब ServeHTTPहै कि स्टैंडअलोन फ़ंक्शन नहीं है। फ़ंक्शन नाम से पहले कोष्ठक उस ऑब्जेक्ट को परिभाषित करने का गो तरीका है जिस पर ये फ़ंक्शन संचालित होंगे। तो, अनिवार्य रूप ServeHTTPसे टाइप हैंडलर की एक विधि है और किसी भी ऑब्जेक्ट का उपयोग करके आह्वान किया जा सकता है, एच कहते हैं, टाइप हैंडलर की।

h.ServeHTTP(w, r)

उन्हें रिसीवर भी कहा जाता है। वहाँ उन्हें परिभाषित करने के दो तरीके हैं। यदि आप रिसीवर को संशोधित करना चाहते हैं तो एक पॉइंटर का उपयोग करें जैसे:

func (s *MyStruct) pointerMethod() { } // method on pointer

यदि आपको रिसीवर को संशोधित करने की आवश्यकता नहीं है, तो आप रिसीवर को मूल्य के रूप में परिभाषित कर सकते हैं:

func (s MyStruct)  valueMethod()   { } // method on value

गो खेल के मैदान का यह उदाहरण अवधारणा को प्रदर्शित करता है।

package main

import "fmt"

type Mutatable struct {
    a int
    b int
}

func (m Mutatable) StayTheSame() {
    m.a = 5
    m.b = 7
}

func (m *Mutatable) Mutate() {
    m.a = 5
    m.b = 7
}

func main() {
    m := &Mutatable{0, 0}
    fmt.Println(m)
    m.StayTheSame()
    fmt.Println(m)
    m.Mutate()
    fmt.Println(m)

उपरोक्त कार्यक्रम का आउटपुट है:

&{0 0}
&{0 0}
&{5 7}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.