गो का "गोटो" कथन क्यों है


110

मुझे यह जानकर आश्चर्य हुआ कि गो का 'गोटो' कथन है। मुझे हमेशा सिखाया गया है कि 'गोटो' बयान अतीत की बात है और इसके लिए बुराई एक कार्यक्रम के वास्तविक प्रवाह को रोकती है, और यह कि फ़ंक्शन या विधियां हमेशा प्रवाह को नियंत्रित करने का एक बेहतर तरीका हैं।

मेरा कुछ छूट रहा है। Google ने इसे क्यों शामिल किया?


5
ऐसे समय होते हैं जहां आपको वास्तव में एक गोटो बयान की आवश्यकता होती है। गोटो की बुराई तभी होती है जब अंधाधुंध इस्तेमाल किया जाता है। उदाहरण के लिए, यदि यह बहुत मुश्किल है, यदि असंभव नहीं है, तो गोटो बयानों के साथ एक परिमित राज्य मशीन पार्सर लिखना है।
xbonez

5
यह गो के लिए विशिष्ट नहीं है, लेकिन इस बात पर एक अच्छी चर्चा के लिए कि भाषा क्यों कथन को बनाए रखती है, और इसके उपयोग के खिलाफ तर्क देखने के लिए, इस पोस्ट को देखें । प्रश्न में कुछ अच्छे संदर्भ जुड़े हुए हैं। संपादित करें: यहाँ एक और है
C

3
प्रदान किए गए SO चर्चाओं के माध्यम से ओपी को ग्रेपिंग से बचाने के लिए, यहाँ LKML पर चर्चा की गई है, जो gotoकुछ मामलों में उपयोगी होने के कारण इसे बहुत अधिक मात्रा में प्रस्तुत करती है। अध्ययन के @ Kissaki के जवाब के बाद पढ़ें।
कोस्टिक्स


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

जवाबों:


78

जब हम वास्तव में गो मानक पुस्तकालय के स्रोत कोड की जांच करते हैं, तो हम देख सकते हैं कि gotoवास्तव में कहां लागू होते हैं।

उदाहरण के लिए, में math/gamma.goफ़ाइल, बयान का इस्तेमाल किया है :goto

  for x < 0 {
    if x > -1e-09 {
      goto small
    }
    z = z / x
    x = x + 1
  }
  for x < 2 {
    if x < 1e-09 {
      goto small
    }
    z = z / x
    x = x + 1
  }

  if x == 2 {
    return z
  }

  x = x - 2
  p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6]
  q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7]
  return z * p / q

small:
  if x == 0 {
    return Inf(1)
  }
  return z / ((1 + Euler*x) * x)
}

gotoइस मामले में सिर्फ नियंत्रण प्रवाह के लिए इस्तेमाल किया एक और (बुलियन) चर, अंत में शुरू करने के लिए जाँच की से हमें बचाता है। इस मामले में , gotoकथन वास्तव में कोड को पढ़ने और आसान पालन करने के लिए बेहतर बनाता है ( gotoआपके द्वारा बताए गए तर्क के विपरीत )।

यह भी ध्यान दें, कि gotoकथन का बहुत विशिष्ट उपयोग-मामला है। गोटो पर भाषा विनिर्देश कहा गया है कि यह खत्म हो गया दायरे में आने से चर कूद नहीं हो सकता है (घोषित किया गया), और यह अन्य (code-) ब्लॉक में कूद नहीं कर सकते।


69
आपके उदाहरण में, small(x,z)बजाय कॉल करने के लिए एक फ़ंक्शन का परिचय क्यों दें ? इस तरह से हमें यह सोचने की ज़रूरत नहीं है कि small:लेबल में कौन से चर सुलभ हैं । मुझे लगता है कि यह कारण अभी भी संकलक में कुछ प्रकार के इनलाइनिंग समर्थन का अभाव है।
थॉमस अहले

5
@Jessta: यही हम दृश्यता और गुंजाइश के लिए, सही है?
थॉमस अहले

6
@ThomasAhle गो gotoनए वैरिएबल पेश किए जाने के बाद एक लेबल को इंगित करने की अनुमति नहीं देता है। "गोटो" कथन को निष्पादित करने से किसी भी चर का उस दायरे में नहीं आना चाहिए जो गोटो के बिंदु पर पहले से ही दायरे में नहीं था।
km6zla

4
@ ogc-nick माफ़ करें मैं स्पष्ट नहीं था, मेरा मतलब था कि फ़ंक्शंस को उस दायरे में घोषित किया जा सकता है जहां उनकी आवश्यकता है, इसलिए वे कोड को दिखाई नहीं देते हैं जिनकी उन्हें आवश्यकता नहीं है। मैं गोटो और स्कोप के बारे में बात नहीं कर रहा था।
थॉमस अहले

4
@MosheRevah संदर्भित कोड पठनीयता के लिए अनुकूलित नहीं है। यह कच्चे प्रदर्शन के लिए अनुकूलित है, एक गोटो का उपयोग करके जो एक फ़ंक्शन के भीतर 22 लाइनें फैलाता है। (और थॉमस अहले का प्रस्ताव मेरी नज़र में और भी पठनीय है।)
joel.neely

30

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

यदि कुछ अन्य नियंत्रण सुविधा (जो एक बहुत स्पष्ट तरीके से उपयोग की जाती है) जो आप चाहते हैं वह कर सकते हैं, तो आपको इसे गोटो के लिए प्राथमिकता में उपयोग करना चाहिए। यदि नहीं, तो बोल्ड बनें और गोटो का उपयोग करें!

अंत में यह ध्यान देने योग्य है कि गो के गोटो में कुछ अस्पष्ट कीड़े से बचने के लिए डिज़ाइन किए गए कुछ प्रतिबंध हैं। इन प्रतिबंधों को देखें


7

60 और 70 के दशक में स्पेगेटी कोड के युग के बाद से गोटो के बयानों को बहुत बदनाम किया गया है । पीछे तो सॉफ्टवेयर विकास की कोई भी पद्धति बहुत खराब थी। हालांकि गोटो मूल रूप से दुष्ट नहीं हैं, लेकिन आलसी या अकुशल प्रोग्रामर द्वारा इसका दुरुपयोग और दुरुपयोग किया जा सकता है। दुर्व्यवहार किए गए गोतोस के साथ कई समस्याओं को विकास प्रक्रियाओं जैसे टीम कोड समीक्षाओं के साथ हल किया जा सकता है।

gotoके रूप में एक ही तकनीकी तरीके से कूद रहे हैं continue, breakऔर return। कोई यह तर्क दे सकता है कि ये बयान उसी तरह से बुरे हैं लेकिन ये नहीं हैं।

गो टीम को क्यों शामिल किया गया है गोटोस शायद इस तथ्य के कारण है कि यह एक सामान्य प्रवाह नियंत्रण आदिम है। इसके अतिरिक्त, उन्होंने उम्मीद की कि निष्कर्ष निकाला है कि गो के दायरे को एक मूर्ख-सुरक्षित भाषा का दुरुपयोग करने के लिए संभव नहीं है।


continue, breakऔर returnएक विशेष रूप से बहुत अलग हैं: वे केवल निर्दिष्ट करते हैं "एन्कोडिंग गुंजाइश छोड़ दें"। वे न केवल प्रोत्साहित करते हैं बल्कि स्पष्ट रूप से आवश्यकता होती है कि डेवलपर अपने कोड की संरचना पर विचार करें और संरचित प्रोग्रामिंग प्राइमेटिव्स (लूप, फ़ंक्शंस और स्विच स्टेटमेंट के लिए) पर भरोसा करें । gotoबयानों की एक और एकमात्र कृपा यह है कि वे आपको एक HLL में असेंबली लिखने की अनुमति देते हैं जब कंपाइलर का अनुकूलक कार्य पर निर्भर नहीं होता है, लेकिन यह पठनीयता और स्थिरता की लागत पर आता है।
पार्थियन शॉट

कारण यह इतना ही बार में खोजने के लिए आश्चर्य की बात है कि है, हर दूसरे मामले में जहां golang डेवलपर्स संरचित प्रोग्रामिंग प्रतिमान और "असाधारण प्रवाह नियंत्रण" के बीच एक विकल्प था में / अनुदेश सूचक जोड़तोड़ की तरह setjmp, longjmp, goto, और try / except / finallyवे गलती करना तरफ चुना सावधानी से। goto, fwict, "संरचित प्रोग्रामिंग" नियंत्रण प्रवाह के लिए एकमात्र परिचित है।
पार्थियन शॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.