गो भाषा में असाइनमेंट ऑपरेटर


84

हाल ही में मैं Google की नई प्रोग्रामिंग भाषा Go के साथ खेल रहा था

और सोच रहा था कि असाइनमेंट ऑपरेटर :=के बराबर चिन्ह = के सामने एक कोलन क्यों है? क्या कोई विशेष कारण है कि भाषा के लेखक name := "John"इसके बजाय उपयोग करना चाहते हैंname = "John"


महान प्रश्न और उत्तर यह है कि असाइनमेंट के लिए = का उपयोग करना एक गलती है। आपने जल्दी सीख लिया कि x + 2 = 4 एक समीकरण है जो असाइनमेंट नहीं है। हालांकि, चूंकि असाइनमेंट समानता के लिए जाँच की तुलना में कहीं अधिक लगातार है, इसलिए कुछ प्रमुख भाषाओं ने "=" का उपयोग करना शुरू कर दिया असाइनमेंट के लिए ... और अधिवेशन अटक गया।
रिक ओ'शि

जवाबों:


121

:=अंकन दोनों एक घोषणा के रूप में और आरंभीकरण के रूप में कार्य करता है।

foo := "bar"

के बराबर है

var foo = "bar"

केवल foo = "bar"किसी भी स्क्रिप्टिंग भाषा में उपयोग की तरह क्यों नहीं , आप पूछ सकते हैं? खैर, कि टाइपो से बचने के लिए है।

foo = "bar"
fooo = "baz" + foo + "baz"   // Oops, is fooo a new variable or did I mean 'foo' ?

41
name := "John"

के लिए सिंटैक्टिक शुगर है

var name string
name = "John"

गो को वैधानिक रूप से टाइप किया गया है, इसलिए आपको चर घोषित करना होगा।


7
name := "John"के लिए आशुलिपि है var name = "John"
पीटरो

15
@peterSO लेकिन var name = "John"कम है var name string = "John"जिसके लिए दिए गए दो लाइनों के लिए छोटा है।
डेव सी

2
@Dave C: गो प्रोग्रामिंग लैंग्वेज स्पेसिफिकेशन स्पष्ट है: "एक शॉर्ट वेरिएबल डिक्लेरेशन ... इनिशियल एक्सप्रेशन के साथ रेगुलर वेरिएबल डिक्लेरेशन के लिए एक शॉर्टहैंड है, लेकिन नो टाइप्स: "var" IdentifierList = ExpressionList ."।
पीटरो

7
@peterSO मुझे पता है, मैंने वह भी पढ़ा है। मैंने जो कहा, वह नहीं बदला। यह उत्तर सही है।
डेव सी

1
@KennethWorden यह पठनीयता में बाधा कैसे डालता है? यह अनावश्यक जानकारी को कम करता है। पूर्ण प्रकार के आक्षेप के साथ भाषाएं इस बात का एक अच्छा उदाहरण हैं कि यह एक अच्छी बात क्यों है।
१29 को जौनजान

19

:=असाइनमेंट ऑपरेटर नहीं है। यह एक लघु चर घोषणा है। =असाइनमेंट ऑपरेटर है।

लघु चर घोषणाएं

एक लघु चर घोषणा सिंटैक्स का उपयोग करती है:

ShortVarDecl = IdentifierList ":=" ExpressionList .

यह शुरुआती चर के साथ एक नियमित चर घोषणा के लिए एक आशुलिपि है, लेकिन कोई प्रकार नहीं:

"var" IdentifierList = ExpressionList .

कार्य

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

गो में, के name := "John"लिए आशुलिपि है var name = "John"


11

रोब पाइक बताते हैं कि गो ने :=अपनी बात "ओरिजिन ऑफ़ गो" (2010) के दौरान क्यों की ।

:=एक अन्य भाषा में एक छद्म संचालक था जिसे पाइक द्वारा नियोजित किया गया था जिसे न्यूज़क्यूक (1989) कहा जाता है। जिसकी घोषणा के लिए पास्कल-ईश संकेतन और अनुमान लगाने और टाइप करने की क्षमता थी ( पृष्ठ 15 )

// variable: [type] = value
x: int = 1
x := 1

सीमांत ध्यान दें: रॉबर्ट ग्रीसेमर लाता := ऑपरेटर सवाल का जवाब "क्या एक बात आप जाओ से बाहर ले होगा?" Google I / O 2013 में QA सत्र के दौरान। इसका संदर्भ सुविधाजनक और समस्याग्रस्त है


4

दोनों गो भाषा में परिवर्तनशील घोषणा की अलग तकनीक हैं।

var name = "John" // is a variable declaration 

तथा

name := "John"   // is a short variable declaration. 

एक लघु चर घोषणा एक प्रारंभिक चर अभिव्यक्ति के साथ एक नियमित चर घोषणा के लिए आशुलिपि है, लेकिन कोई प्रकार नहीं है।

विस्तार के लिए नीचे पढ़ें:

परिवर्तनशील घोषणाएँ

लघु चर घोषणाएं


4

के बीच कम से कम एक सूक्ष्म अंतर है

name := "John"

तथा

var name = "John"

पूर्व एक गैर-घोषणा बयान है और एक फ़ंक्शन बॉडी के बाहर अनुमति नहीं है, जबकि बाद वाला पैकेज स्तर पर एक मान्य स्टेटमेंट है।


2

उत्तर के लिए महत्वपूर्ण संदर्भ:

:=एक चर को शुरू करने के लिए एक आशुलिपि ऑपरेटर है। में जाओ , निम्न कार्रवाई के बराबर हैं:

var myNumb String = "one"
myNumb := "one"

उत्तर:

निहित प्रश्न अब यह है: "क्यों पहले :=एक करने के लिए शॉर्टहैंड अंकन डिजाइन किया था ?"। इसका कारण प्रचलित टाइपोस को रोकना है। यदि शॉर्टहैंड असाइनमेंट ऑपरेटर बस था , तो आपके पास निम्न स्थिति हो सकती है::==

var myNumb String = "one"
myNumb = "two"

अब उस कोड को बनाने वाले उपयोगकर्ता ने सही टाइपिंग के बजाय उसे पुन: असाइन twoकरने का इरादा myNumbकिया था या उसने गलत किया था ? एक बृहदान्त्र में शामिल करने के लिए , प्रोग्रामर को दो त्रुटियां करनी होंगी (बृहदान्त्र को भूल जाओ और भूल जाओ ) ताकि बग न हो, इसलिए ऐसा करने की संभावना कम हो जाती हैmyNumbmyNumbTwo:=var

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