तीन डॉट्स (...) के साथ उपसर्ग किए गए एक पैरामीटर प्रकार को एक वैरेडिक पैरामीटर कहा जाता है । इसका मतलब है कि आप किसी भी संख्या या तर्क को उस पैरामीटर में पास कर सकते हैं (जैसे कि fmt.Printf()
)। फ़ंक्शन पैरामीटर के लिए तर्कों की सूची पैरामीटर के लिए घोषित प्रकार के स्लाइस ( []interface{}
आपके मामले में) के रूप में प्राप्त करेगा। जाओ विशिष्टता कहता है:
एक फ़ंक्शन हस्ताक्षर में अंतिम पैरामीटर के साथ एक प्रकार का उपसर्ग हो सकता है .... ऐसे पैरामीटर के साथ एक फ़ंक्शन को वैरेडिक कहा जाता है और उस पैरामीटर के लिए शून्य या अधिक तर्कों के साथ आमंत्रित किया जा सकता है।
एक पैरामीटर:
a ...interface{}
के बराबर कार्य के लिए है:
a []interface{}
अंतर यह है कि आप इस तरह के फ़ंक्शन के लिए तर्क कैसे पास करते हैं। यह या तो स्लाइस के प्रत्येक तत्व को अलग-अलग देकर या एक ही स्लाइस के रूप में किया जाता है, जिस स्थिति में आपको तीन डॉट्स के साथ स्लाइस-मान को प्रत्यय देना होगा। निम्नलिखित उदाहरण समान कॉल में परिणाम करेंगे:
fmt.Println("First", "Second", "Third")
के रूप में ही करेंगे:
s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)
यह गो विशिष्टता में भी काफी अच्छी तरह से समझाया गया है :
फ़ंक्शन और कॉल को देखते हुए
func Greeting(prefix string, who ...string)
Greeting("nobody")
Greeting("hello:", "Joe", "Anna", "Eileen")
भीतर Greeting
, पहली कॉल में who
मूल्य होगा nil
, और []string{"Joe", "Anna", "Eileen"}
दूसरे में।
यदि अंतिम तर्क एक स्लाइस प्रकार के लिए असाइन किया गया है []T
, तो इसे ...T
पैरामीटर के मान के रूप में अपरिवर्तित किया जा सकता है यदि तर्क का पालन किया जाता है ...
। इस स्थिति में कोई नया स्लाइस नहीं बनाया जाता है।
स्लाइस s
और कॉल को देखते हुए
s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)
भीतर Greeting
, who
एक s
ही अंतर्निहित सरणी के साथ के रूप में एक ही मूल्य होगा ।