यहां पहले से ही अच्छे उत्तर हैं। मुझे उन लोगों के लिए भी अपने खुद को जोड़ने दें जो इसे सहज रूप से समझना चाहते हैं:
इंटरफेस
यहाँ एक विधि के साथ एक इंटरफ़ेस है:
type Runner interface {
Run()
}
तो किसी भी प्रकार की Run()
विधि के लिए रनर इंटरफ़ेस को संतुष्ट करता है:
type Program struct {
/* fields */
}
func (p Program) Run() {
/* running */
}
func (p Program) Stop() {
/* stopping */
}
हालाँकि प्रोग्राम प्रकार में एक स्टॉप विधि भी है, फिर भी यह रनर इंटरफ़ेस को संतुष्ट करता है क्योंकि इसकी आवश्यकता के लिए एक इंटरफ़ेस के सभी तरीकों को संतुष्ट करना है।
तो, यह एक रन विधि है और यह रनर इंटरफ़ेस को संतुष्ट करता है।
खाली इंटरफ़ेस
यहां किसी भी तरीके के बिना नामित इंटरफ़ेस है:
type Empty interface {
/* it has no methods */
}
तो किसी भी प्रकार इस इंटरफ़ेस को संतुष्ट करता है। क्योंकि, इस इंटरफ़ेस को संतुष्ट करने के लिए किसी विधि की आवश्यकता नहीं है। उदाहरण के लिए:
// Because, Empty interface has no methods, following types satisfy the Empty interface
var a Empty
a = 5
a = 6.5
a = "hello"
लेकिन, क्या उपरोक्त प्रोग्राम प्रकार इसे संतुष्ट करता है? हाँ:
a = Program{} // ok
इंटरफ़ेस {} ऊपर के खाली इंटरफ़ेस के बराबर है।
var b interface{}
// true: a == b
b = a
b = 9
b = "bye"
जैसा कि आप देखते हैं, इसके बारे में कुछ भी रहस्यमय नहीं है लेकिन इसका दुरुपयोग करना बहुत आसान है। जितना हो सके इससे दूर रहें।
https://play.golang.org/p/A-vwTddWJ7G
interface{}
void *
सी। में कमोबेश बराबर है। यह किसी भी चीज़ की ओर इशारा कर सकता है और इसका उपयोग करने के लिए आपको एक कास्ट / टाइप अभिकथन की आवश्यकता होती है।