golang

2017-10-08 20 views
5

मैं सिर्फ Golang के साथ शुरू किया गया है, और मैं ठेठ स्वैप समारोह उदाहरण देखा में इनपुट चर लौटें:golang

func swap(x, y string) (string, string) { 
    return y, x 
} 

मैं स्वचालित रूप से सोचा था कि नामित रिटर्न इसे हल किया जा सकता था और है कि यह एक मीठा उदाहरण था, तो मैंने छोटे संस्करण की कोशिश की:

package main 

import "fmt" 

func swap(z, y int) (z, y int) { 
    return 
} 

func main() { 
    fmt.Println(swap(2, 3)) 
} 

लेकिन मेरे आश्चर्य से यह एक डुप्लिकेट तर्क के बारे में शिकायत संकलित नहीं किया। इनपुट तर्क वापस करना क्यों संभव नहीं है? क्या मैं कुछ गलत कर रहा हूं या यह सिर्फ समर्थित नहीं है?

मुझे लगा कि यह एक पूरी तरह से वैध उपयोग के मामले था और यह इस प्रयोग के लिए कई अन्य उदाहरण हो सकता था कि।

+2

फ़ंक्शन स्कोप वैरिएबल नामों के अंदर अद्वितीय होना चाहिए, यही कारण है कि –

+0

फ़ंक्शन का "दायरा" कहां से शुरू होता है? अन्य भाषाओं में मेरी समझ यह है कि "func" और "{" के बीच फ़ंक्शन हस्ताक्षर है और दायरा "{" और "}" के बीच है। भाषा में एक डिजाइन त्रुटि हो सकती है? –

उत्तर

2

मुझे लगता है कि समस्या इनपुट तर्क लौटने में समस्या नहीं है, लेकिन नाम डुप्लिकेशंस में: y और z समान स्तर पर दो बार घोषित किया गया है और संकलक अंतर नहीं कर सकते हैं।

4

मैं भी एक Golang शुरुआत कर रहा हूँ। यहां मैंने जो खोजा है वह यहां है।

समस्या अनिवार्य रूप से है, कि तुम z नामित दो चर घोषित, तो उम्मीद उन्हें एकीकृत किया जाना है। यह समर्थित नहीं है, और वास्तव में नामित वापसी प्रकार का मुख्य लक्ष्य, मूल्यों लौटे का अर्थ दस्तावेज़ के लिए है जिसके खिलाफ जाना होगा।

और अधिक विस्तार से व्याख्या करने के लिए, इस निम्नलिखित कोड लिखने की तरह एक सा है:

func badFunction(a int) int { 
    var a int = 0 
    return a 
} 

एक चर दो बार घोषित किया जाता है, और इस पर जाएँ के लिए भ्रमित कर रहा है। अगर हम क्या 'tour of go' नामित वापसी मूल्यों के बारे में क्या कहना है को देखो, हम इस मुद्दे को देख सकते हैं। यह सबसे बड़ा स्रोत नहीं है, लेकिन यह एक स्रोत है:

गो के वापसी मूल्यों का नाम दिया जा सकता है। यदि हां, तो वे समारोह के शीर्ष पर परिभाषित चर के रूप में माना जाता है।

ऐसा कहने के लिए, आपका उदाहरण लगभग badFunction जैसा है। संकलक करने के लिए, इसे इस तरह एक सा दिखता है:

func swap(a, b int) (int, int) { 
    var a int = 0 
    var b int = 0 
    return b, a 
} 

स्वाभाविक रूप से, संकलक, शिकायत a redeclared in block के बारे में है जो एक यद्यपि वैसे बराबर नहीं त्रुटि संबंधित है। आपको प्राप्त होने वाला त्रुटि संदेश अनिवार्य रूप से पूर्व-जांच होता है ताकि उपयोगकर्ता को गायब होने पर उत्पादित कोड को देखने से रोका जा सके।


this Stackoverflow question के रूप में रिपोर्ट, नामित वापसी मान अनिवार्य रूप से केवल प्रलेखन के लिए होना चाहिए। हालांकि, यह आकस्मिक छाया की संभावना का जिक्र करता है। ऐसा हो सकता है कि पहले के संस्करण ने इसका समर्थन किया था, लेकिन तब से इस तरह के नाम टक्कर के कारण बग को रोकने के लिए बदल दिया गया है, हालांकि मुझे इससे संबंधित कुछ भी नहीं मिला है।

effective go section विषय पर भी कुछ कहना है:

वापसी या एक जाओ समारोह की "पैरामीटर" नाम दिया जा सकता है और नियमित रूप से चर के रूप में इस्तेमाल किया, बस भेजे मानकों की तरह होता है।नामित होने पर, फ़ंक्शन शुरू होने पर उन्हें उनके प्रकार के शून्य मानों में प्रारंभ किया जाता है; यदि फ़ंक्शन कोई तर्क के साथ रिटर्न स्टेटमेंट निष्पादित करता है, तो परिणाम पैरामीटर के वर्तमान मान लौटाए गए मानों के रूप में उपयोग किए जाते हैं।

नाम अनिवार्य नहीं हैं लेकिन वे कोड को छोटा और स्पष्ट कर सकते हैं: वे दस्तावेज़ हैं।


टी एल; डॉ: संकलक तरह से आप उम्मीद कर सकते में नामों को एकजुट नहीं है। इस तरह के निहित छायांकन समर्थित नहीं है, और कुछ आसानी से टालने योग्य बग को रोकने के लिए सक्रिय रूप से टालना चाहिए।