क्या गो के फ़ंक्शन में डिफ़ॉल्ट मान निर्दिष्ट करने का कोई तरीका है? मैं इसे प्रलेखन में खोजने की कोशिश कर रहा हूं, लेकिन मुझे ऐसा कुछ भी नहीं मिल रहा है जो यह निर्दिष्ट करता हो कि यह संभव है।
func SaySomething(i string = "Hello")(string){
...
}
जवाबों:
नहीं, Google ने जो शक्तियां चुनीं, उन्होंने उसका समर्थन नहीं किया।
https://groups.google.com/forum/#!topic/golang-nuts/-5MCaivW0qQ
नहीं, लेकिन डिफ़ॉल्ट मान को लागू करने के लिए कुछ अन्य विकल्प हैं। विषय पर कुछ अच्छे ब्लॉग पोस्ट हैं, लेकिन यहां कुछ विशिष्ट उदाहरण हैं।
// 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)
}
// 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)
}
// 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)
}
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)
}
func Concat1(a string = 'foo', b int = 10) string {
अधिकांश अन्य आधुनिक भाषाओं की तरह ... यह दिए गए उदाहरणों में से किसी को भी कोड की एक पंक्ति तक कम कर देता।
नहीं, चूक को निर्दिष्ट करने का कोई तरीका नहीं है। मेरा मानना है कि यह लेखक के अंत में थोड़ा और समय (और, उम्मीद है, विचार) की कीमत पर पठनीयता बढ़ाने के उद्देश्य से किया जाता है।
मुझे लगता है कि "डिफ़ॉल्ट" होने के लिए उचित दृष्टिकोण एक नया फ़ंक्शन है जो उस डिफ़ॉल्ट को अधिक सामान्य फ़ंक्शन की आपूर्ति करता है। ऐसा करने पर, आपका कोड आपके इरादे पर स्पष्ट हो जाता है। उदाहरण के लिए:
func SaySomething(say string) {
// All the complicated bits involved in saying something
}
func SayHello() {
SaySomething("Hello")
}
बहुत कम प्रयासों के साथ, मैंने एक ऐसा कार्य किया जो सामान्य बात करता है और सामान्य फ़ंक्शन का पुन: उपयोग करता है। आप इसे कई पुस्तकालयों में देख सकते हैं, fmt.Println
उदाहरण के लिए बस एक नई पंक्ति जोड़ता है जो fmt.Print
अन्यथा क्या करेगा। हालांकि, किसी के कोड को पढ़ते समय, यह स्पष्ट है कि वे उस फ़ंक्शन से क्या करना चाहते हैं जिसे वे कहते हैं। डिफ़ॉल्ट मानों के साथ, मुझे पता नहीं चलेगा कि क्या होना चाहिए, वह भी बिना फ़ंक्शन के संदर्भ के लिए जा रहा है कि डिफ़ॉल्ट मूल्य वास्तव में क्या है।