গো এর পদ্ধতিতে ডিফল্ট মান


99

গো ফাংশনে ডিফল্ট মান নির্দিষ্ট করার কোনও উপায় আছে কি? আমি ডকুমেন্টেশনে এটি সন্ধান করার চেষ্টা করছি তবে আমি এমন কিছু খুঁজে পাচ্ছি না যা উল্লেখ করে যে এটি এমনকি সম্ভব।

func SaySomething(i string = "Hello")(string){
...
}

উত্তর:



117

না, তবে ডিফল্ট মান প্রয়োগের জন্য আরও কিছু বিকল্প রয়েছে। বিষয়টিতে কয়েকটি ভাল ব্লগ পোস্ট রয়েছে তবে এখানে কয়েকটি নির্দিষ্ট উদাহরণ দেওয়া হল।


** বিকল্প 1: ** কলার ডিফল্ট মান ব্যবহার করতে পছন্দ করে
// Both parameters are optional, use empty string for default value
func Concat1(a string, b int) string {
  if a == "" {
    a = "default-a"
  }
  if b == 0 {
    b = 5
  }

  return fmt.Sprintf("%s%d", a, b)
}

** বিকল্প 2: ** শেষে একক alচ্ছিক প্যারামিটার
// a is required, b is optional.
// Only the first value in b_optional will be used.
func Concat2(a string, b_optional ...int) string {
  b := 5
  if len(b_optional) > 0 {
    b = b_optional[0]
  }

  return fmt.Sprintf("%s%d", a, b)
}

** বিকল্প 3: ** একটি কনফিগার স্ট্রাক্ট
// A declarative default value syntax
// Empty values will be replaced with defaults
type Parameters struct {
  A string `default:"default-a"` // this only works with strings
  B string // default is 5
}

func Concat3(prm Parameters) string {
  typ := reflect.TypeOf(prm)

  if prm.A == "" {
    f, _ := typ.FieldByName("A")
    prm.A = f.Tag.Get("default")
  }

  if prm.B == 0 {
    prm.B = 5
  }

  return fmt.Sprintf("%s%d", prm.A, prm.B)
}

** বিকল্প 4: ** সম্পূর্ণ বৈকল্পিক যুক্তি পার্সিং (জাভাস্ক্রিপ্ট স্টাইল)
func Concat4(args ...interface{}) string {
  a := "default-a"
  b := 5

  for _, arg := range args {
    switch t := arg.(type) {
      case string:
        a = t
      case int:
        b = t
      default:
        panic("Unknown argument")
    }
  }

  return fmt.Sprintf("%s%d", a, b)
}

90
কি যে ব্যথা. আমি আশা করি এটি ছিল: func Concat1(a string = 'foo', b int = 10) string {অন্যান্য আধুনিক ভাষাগুলির মতো ... এটি কোডের এক লাইনে প্রদত্ত উদাহরণগুলিকে খুব কমিয়ে ফেলবে।
রোটারেটি

আমাদের কাছে কী দুটি পৃথক ফাংশন লেখার বিকল্প রয়েছে এবং তারা কী প্রত্যাশা করে তা স্পষ্ট করার জন্য এটি কলারের কাছে রেখে দেয়।
ProgramCpp

@ প্রোগ্রামসিপি নং, গোলং ফাংশন ওভারলোডিংকে অনুমতি দেয় না গো ভাষায় কি ফাংশন / পদ্ধতি ওভারলোডিং রয়েছে?
ভাসাল

9

না, ডিফল্ট নির্দিষ্ট করার কোনও উপায় নেই। আমি বিশ্বাস করি এটি লেখকের শেষের দিকে আরও কিছুটা সময় ব্যয় করে (এবং আশাবাদী, চিন্তাভাবনা) পাঠযোগ্যতা বাড়ানোর উদ্দেশ্যে করা হয়েছে।

আমি মনে করি একটি "ডিফল্ট" থাকার সঠিক পদ্ধতির একটি নতুন ফাংশন হ'ল যা ডিফল্টটিকে আরও জেনেরিক ফাংশনে সরবরাহ করে। এটি থাকার পরে, আপনার কোডটি আপনার অভিপ্রায়ে আরও স্পষ্ট হয়ে ওঠে। উদাহরণ স্বরূপ:

func SaySomething(say string) {
    // All the complicated bits involved in saying something
}

func SayHello() {
    SaySomething("Hello")
}

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


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

12
"শুধু আরেকটি ফাংশন জুড়ুন" যুক্তি পদ্ধতির একটি বিস্ফোরণ ঘটাতে পারে একাধিক permutations সাথে মোকাবিলা করা প্রয়োজন, যারা পদ্ধতি জন্য, অর্থপূর্ণ আবিষ্কারযোগ্য স্মরণীয় করে রাখতে নাম সিদ্ধান্ত বোঝা প্রয়োজন আছে এবং প্যাকেজ যে আরো পদ্ধতি বনাম ব্যবহার শেখার বোঝা যোগ কম। #jmtcw
মাইকস্কিঙ্কেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.