का अर्थ ... इंटरफ़ेस {} (डॉट डॉट इंटरफ़ेस)


92

नीचे गो कोड का एक टुकड़ा है जिसके बारे में मेरे पास सवाल है। विशेष रूप से, aइस फ़ंक्शन में क्या है ?

func DPrintf(format string, a ...interface{}) (n int, err error) {
  if Debug > 0 {
    n, err = fmt.Printf(format, a...)
  }
  return
}

क्या कोई मुझे बता सकता है कि तीन डॉट्स यहाँ क्या हैं? और क्या करता ...interface{}है?


31
बिंदी को ईलिप्सिस कहा जाता है।
एरिक वेस्ट्रुप

जवाबों:


160

तीन डॉट्स (...) के साथ उपसर्ग किए गए एक पैरामीटर प्रकार को एक वैरेडिक पैरामीटर कहा जाता है । इसका मतलब है कि आप किसी भी संख्या या तर्क को उस पैरामीटर में पास कर सकते हैं (जैसे कि 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ही अंतर्निहित सरणी के साथ के रूप में एक ही मूल्य होगा ।


10

जहाँ तक interface{}शब्द है, यह खाली इंटरफ़ेस है। दूसरे शब्दों में, गो में सभी वेरिएबल्स द्वारा लागू किया गया इंटरफ़ेस।

यह सी # java.lang.Objectया के अनुरूप है System.Object, लेकिन इसके बजाय भाषा में प्रत्येक चर प्रकार को शामिल किया गया है। तो यह आपको विधि के लिए कुछ भी पारित करने देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.