কেন গো এর একটি "গোটো" বিবৃতি আছে


110

আমি অবাক হয়ে জানতে পারি যে গো এর 'গোটো' বিবৃতি রয়েছে। আমাকে সর্বদা শিখিয়ে দেওয়া হয়েছে যে 'গেটো' বিবৃতিগুলি অতীতের একটি বিষয় এবং এটি কোনও প্রোগ্রামের আসল প্রবাহকে অন্তর্ভুক্ত করে এবং এটি ফাংশন বা পদ্ধতি সর্বদা প্রবাহকে নিয়ন্ত্রণ করার একটি সর্বোত্তম উপায়।

আমি নিশ্চিত কিছু একটা ভুলে যাচ্ছি। গুগল কেন এটি অন্তর্ভুক্ত করেছিল?


5
এমন অনেক সময় আছে যেখানে আপনার সত্যিকার অর্থে গোটো স্টেটমেন্টের প্রয়োজন হয়। গোটগুলি কেবল তখন নির্বিচারে ব্যবহার করা হলে মন্দ evil উদাহরণস্বরূপ, যদি খুব কঠিন হয় তবে যদি অসম্ভব না হয় তবে একটি গোপনীয় বিবৃতি সহ একটি ফাইনাইট স্টেট মেশিন পার্সার লিখতে হবে।
xbonez

5
এটি গো নির্দিষ্ট নয়, তবে ভাষাগুলি কেন বিবৃতি ধরে রাখে এবং এর ব্যবহারের বিরুদ্ধে তর্কগুলি দেখতে এই বিষয়ে একটি ভাল আলোচনার জন্য এই পোস্টটি দেখুন । প্রশ্নটিতে কিছু ভাল রেফারেন্স যুক্ত রয়েছে। সম্পাদনা: এখানে অন্য একটি
সি

3
সরবরাহিত এসও আলোচনার মাধ্যমে ওপিকে গ্রেপিং থেকে বাঁচানোর জন্য, এখানে এলকেএমএল-এর আলোচনাটি রয়েছে যা gotoকিছু ক্ষেত্রে কার্যকর কেন এটি যথেষ্ট পরিমাণে সমান । @ কিসাকির উত্তর অধ্যয়ন করার পরে পড়ুন।
কোস্টিক্স


এটি একটি ধারাবাহিকতা প্যাটার্ন বাস্তবায়ন করে, যেখানে আপনি স্ট্যাকটি সংরক্ষণ করে তারপরে আবার শুরু করতে চাইলে আপনি যেখানে ছিলেন সেখানে ফিরে যান।
জাস্টিন ডেন্নাওয়ার

উত্তর:


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
@ জেস্তা: ঠিক এর জন্য আমরা দৃশ্যমানতা এবং সুযোগ পেয়েছি?
টমাস আহলে

6
@ থমাস অহলে গো gotoনতুন ভেরিয়েবল চালু হওয়ার পরে কোনও লেবেলে নির্দেশ করতে দেয় না । "গোটো" বিবৃতি কার্যকর করার ফলে কোনও পরিবর্তনশীল সুযোগে আসতে হবে না যা গোটো এর বিন্দুতে ইতিমধ্যে সুযোগে ছিল না।
কিমি

4
@ ওজিসি-নিক দুঃখিত, আমি পরিষ্কার ছিলাম না, আমি বোঝাতে চাইছিলাম যে ফাংশনগুলি তাদের প্রয়োজনীয় ক্ষেত্রগুলিতে ঘোষিত হতে পারে, তাই কোডগুলির সাথে সেগুলি দৃশ্যমান নয় যা তাদের প্রয়োজন নেই। আমি গোটো এবং স্কোপ নিয়ে কথা বলছিলাম না।
থমাস আহলে

4
পছন্দ করেছেন এটি কাঁচা পারফরম্যান্সের জন্য অনুকূলিত হয়েছে, এমন একটি গোটো ব্যবহার করে যা একক ফাংশনের মধ্যে 22 টি লাইন ছড়িয়ে দেয়। (এবং টমাস
আহেলের

30

গোটো একটি ভাল ধারণা যখন কোনও অন্তর্নির্মিত নিয়ন্ত্রণ বৈশিষ্ট্যগুলি আপনি যা চান তা পুরোপুরি না করে এবং আপনি যখন যা চান তা প্রকাশ করতে পারেন। (যখন আপনার কাছে গোটো নেই তখন কিছু ভাষায় এটি লজ্জার বিষয়।

যদি অন্য কিছু নিয়ন্ত্রণ বৈশিষ্ট্য (যুক্তিসঙ্গত সুস্পষ্ট উপায়ে ব্যবহার করা হয়) আপনি যা করতে পারেন তা করতে পারেন, আপনার এটি গোটো পছন্দ হিসাবে ব্যবহার করা উচিত। যদি না হয়, সাহসী হন এবং গোটো ব্যবহার করুন!

পরিশেষে এটি লক্ষণীয় যে গোসের গোটোতে কিছু অস্পষ্ট বাগগুলি এড়াতে কিছু বিধিনিষেধ তৈরি করা হয়েছে। অনুমান এই নিষেধাজ্ঞাগুলি দেখুন


7

60 এবং 70 এর দশকে স্পাগেটি কোডের যুগের পর থেকে গোটো স্টেটমেন্টগুলি প্রচুর কুখ্যাত হয়েছে । এরপরে কোনও সফ্টওয়্যার বিকাশের পদ্ধতিতে খুব খারাপ ছিল না। তবে গোটো স্থানীয়ভাবে মন্দ নয় তবে অবশ্যই অলস বা দক্ষ নয় এমন প্রোগ্রামারদের দ্বারা অপব্যবহার ও অপব্যবহার করা যেতে পারে। টিম কোড পর্যালোচনার মতো উন্নয়নমূলক প্রক্রিয়াগুলির সাথে আপত্তিজনক গোটোসের সাথে অনেকগুলি সমস্যা সমাধান করা যেতে পারে।

gotoহিসাবে একই প্রযুক্তিগত পদ্ধতিতে জাম্প হয় continue, breakএবং return। কেউ তর্ক করতে পারে যে এগুলি একই ধরণের বিবৃতিগুলি খারাপ তবে তারা তা নয়।

গো দলটি কেন গোটোসকে অন্তর্ভুক্ত করেছে এটি সম্ভবত একটি সাধারণ প্রবাহ নিয়ন্ত্রণ আদিম কারণেই are অতিরিক্তভাবে তারা আশাবাদীভাবে এই সিদ্ধান্তে উপনীত হয়েছে যে গো-এর সুযোগটি একটি বোকা-সুরক্ষিত ভাষা তৈরি করা বাদ দেয় যা অপব্যবহার করা সম্ভব নয়।


continue, breakএবং returnএকটি বিশেষ কীতে খুব আলাদা: তারা কেবল "ঘেরের সুযোগ ছেড়ে দিন" নির্দিষ্ট করে leave তারা কেবল উত্সাহ দেয় না তবে স্পষ্টভাবে প্রয়োজন যে বিকাশকারী তাদের কোডের কাঠামো বিবেচনা করুন এবং কাঠামোগত প্রোগ্রামিং আদিমগুলির উপর নির্ভর করুন (লুপ, ফাংশন এবং স্যুইচ স্টেটমেন্টের জন্য)। gotoবিবৃতিগুলির একমাত্র এবং কেবল সংরক্ষণের অনুগ্রহটি হ'ল সংকলকের অপ্টিমাইজারটি টাস্কে না উঠলে তারা আপনাকে এইচএলএলে সমাবেশ লিখতে দেয়, তবে এটি পঠনযোগ্যতা এবং রক্ষণাবেক্ষণের জন্য ব্যয় হয়।
পার্থিয়ান শট

কারণ এই তাই বারেই এটি বিস্ময়কর যে, প্রত্যেক অন্যান্য ক্ষেত্রে যেখানে golang ডেভেলপারদের গঠিত প্রোগ্রামিং দৃষ্টান্ত এবং "ব্যতিক্রমী প্রবাহ নিয়ন্ত্রণ" মধ্যে একটা চয়েস ছিল ইন / নির্দেশ পয়েন্টার হেরফেরের পছন্দ setjmp, longjmp, goto, এবং try / except / finallyতারা মাত্রই ভুল পাশ দিয়ে বেছে নেওয়া হয়েছে সাবধানতা অবলম্বন। gotoআসলেই, "কাঠামোগত প্রোগ্রামিং" নিয়ন্ত্রণ প্রবাহের একমাত্র পরিচিতি।
পার্থিয়ান শট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.