गो विधि में डिफ़ॉल्ट मान


103

क्या गो के फ़ंक्शन में डिफ़ॉल्ट मान निर्दिष्ट करने का कोई तरीका है? मैं इसे प्रलेखन में खोजने की कोशिश कर रहा हूं, लेकिन मुझे ऐसा कुछ भी नहीं मिल रहा है जो यह निर्दिष्ट करता हो कि यह संभव है।

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

जवाबों:



128

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


** विकल्प 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: ** अंत में एक एकल वैकल्पिक पैरामीटर
// 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)
}

99
क्या मुसीबत है। काश यह होता: func Concat1(a string = 'foo', b int = 10) string {अधिकांश अन्य आधुनिक भाषाओं की तरह ... यह दिए गए उदाहरणों में से किसी को भी कोड की एक पंक्ति तक कम कर देता।
रोटारटी

क्या हमारे पास दो अलग-अलग कार्य लिखने का विकल्प है और इसे कॉलर को छोड़ दें कि वे क्या उम्मीद करते हैं।
ProgramCpp

@ProgramCpp नहीं, गोलांग फंक्शन ओवरलोडिंग की अनुमति नहीं देता है। क्या गो भाषा में फ़ंक्शन / मेथड ओवरलोडिंग है?
वुलस

11

नहीं, चूक को निर्दिष्ट करने का कोई तरीका नहीं है। मेरा मानना ​​है कि यह लेखक के अंत में थोड़ा और समय (और, उम्मीद है, विचार) की कीमत पर पठनीयता बढ़ाने के उद्देश्य से किया जाता है।

मुझे लगता है कि "डिफ़ॉल्ट" होने के लिए उचित दृष्टिकोण एक नया फ़ंक्शन है जो उस डिफ़ॉल्ट को अधिक सामान्य फ़ंक्शन की आपूर्ति करता है। ऐसा करने पर, आपका कोड आपके इरादे पर स्पष्ट हो जाता है। उदाहरण के लिए:

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

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

बहुत कम प्रयासों के साथ, मैंने एक ऐसा कार्य किया जो सामान्य बात करता है और सामान्य फ़ंक्शन का पुन: उपयोग करता है। आप इसे कई पुस्तकालयों में देख सकते हैं, fmt.Printlnउदाहरण के लिए बस एक नई पंक्ति जोड़ता है जो fmt.Printअन्यथा क्या करेगा। हालांकि, किसी के कोड को पढ़ते समय, यह स्पष्ट है कि वे उस फ़ंक्शन से क्या करना चाहते हैं जिसे वे कहते हैं। डिफ़ॉल्ट मानों के साथ, मुझे पता नहीं चलेगा कि क्या होना चाहिए, वह भी बिना फ़ंक्शन के संदर्भ के लिए जा रहा है कि डिफ़ॉल्ट मूल्य वास्तव में क्या है।


मैं इस जवाब से पसंद करता हूं और सहमत हूं लेकिन लानत है कि मैं अभी भी चाहता हूं कि उनके पास कम से कम ऐसा करने का एक मुहावरेदार लेकिन मुहावरेदार तरीका था।
सैम गोमेना '

15
"सिर्फ एक और समारोह जोड़ें" तर्क के तरीकों में से एक विस्फोट में परिणाम कर सकते कई क्रमपरिवर्तन से निपटने के लिए आवश्यक है, उन तरीकों के लिए, सार्थक खोजने योग्य और rememberable नाम पर निर्णय लेने का बोझ आवश्यकता है, और संकुल है कि और अधिक तरीकों बनाम का उपयोग सीखने के बोझ कहते हैं । कम से। #jmtcw
माइकस्किंकल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.