Go में, कोई फ़ंक्शन केवल फ़ंक्शन परिभाषा में पैरामीटर सूची में निर्दिष्ट प्रकारों के तर्कों को स्वीकार कर सकता है। वैरिएड पैरामीटर भाषा सुविधा थोड़ी जटिल है, लेकिन यह अच्छी तरह से परिभाषित नियमों का पालन करती है।
इसके लिए फ़ंक्शन हस्ताक्षर fmt.Printlnहै:
func Println(a ...interface{}) (n int, err error)
प्रति भाषा specifiction ,
एक फ़ंक्शन हस्ताक्षर में अंतिम आने वाले पैरामीटर में एक प्रकार का उपसर्ग हो सकता है .... ऐसे पैरामीटर के साथ एक फ़ंक्शन को वैरेडिक कहा जाता है और उस पैरामीटर के लिए शून्य या अधिक तर्कों के साथ आमंत्रित किया जा सकता है।
इसका मतलब है कि आप प्रकार Printlnके तर्कों की एक सूची पास कर सकते हैं interface{}। चूंकि सभी प्रकार खाली इंटरफ़ेस को लागू करते हैं, आप किसी भी प्रकार के तर्कों की एक सूची पास कर सकते हैं, जो कि आप कैसे कॉल कर सकते हैं Println(1, "one", true), उदाहरण के लिए, त्रुटि के बिना। भाषा विनिर्देश के "पास होने वाले तर्क ... पैरामीटर" अनुभाग देखें :
पास किया गया मान एक नया स्लाइस प्रकार है [] T एक नए अंतर्निहित सरणी के साथ जिसका क्रमिक तत्व वास्तविक तर्क हैं, जिन्हें सभी को T के लिए असाइन किया जाना चाहिए।
उस हिस्से को जो आपको परेशान कर रहा है, ठीक उसके बाद विनिर्देश में है:
यदि अंतिम तर्क एक स्लाइस प्रकार [] T के लिए लागू होता है, तो इसे मान के रूप में अपरिवर्तित किया जा सकता है ... T पैरामीटर यदि तर्क का अनुसरण किया जाता है .... तो इस मामले में कोई नया स्लाइस नहीं बनता है।
flag.Args()प्रकार है []string। चूंकि Tमें Printlnहै interface{}, []Tहै []interface{}। तो सवाल नीचे आता है कि क्या एक स्ट्रिंग स्लाइस मान इंटरफ़ेस स्लाइस प्रकार के एक चर के लिए उपलब्ध है। आप एक उदाहरण के लिए, उदाहरण के लिए, अपने गो कोड में आसानी से परीक्षण कर सकते हैं:
s := []string{}
var i []interface{}
i = s
यदि आप ऐसे असाइनमेंट का प्रयास करते हैं, तो कंपाइलर इस त्रुटि संदेश को आउटपुट करेगा:
cannot use s (type []string) as type []interface {} in assignment
और यही कारण है कि आप एक तर्क के रूप में स्ट्रिंग स्लाइस के बाद दीर्घवृत्त का उपयोग नहीं कर सकते हैं fmt.Println। यह बग नहीं है, यह इरादा के अनुसार काम कर रहा है।
कई तरीकों से मुद्रित कर सकते हैं की अभी भी बहुत सारे हैं flag.Args()के साथ Printlnइस तरह के रूप में,
fmt.Println(flag.Args())
(जो fmt पैकेज डॉक्युमेंटेशन के[elem0 elem1 ...] अनुसार आउटपुट होगा )
या
fmt.Println(strings.Join(flag.Args(), ` `)
(जो स्ट्रिंग स्लाइस तत्वों को आउटपुट करेगा, प्रत्येक को एक स्थान से अलग किया जाएगा) स्ट्रिंग स्ट्रिंगर के साथ स्ट्रिंग पैकेज में सम्मिलित फ़ंक्शन का उपयोग करके , उदाहरण के लिए।
go run test.go some test flags) के साथ खिलवाड़ कर रहा था , और यहflags.Args()...सिर्फ काम करने के लिए बदल रहा थाflag.Args()(आउटपुट है[some test flags], न्यूलाइन द्वारा पीछा किया जाता है; वास्तविक झंडे दर्ज करने के साथ काम करने के लिए भी लगता है)। यह समझने का नाटक नहीं किया जाएगा, और स्टीफन का जवाब वैसे भी अधिक जानकारीपूर्ण है :)