मुख्य सामग्री पर जाएं
मॉड्यूल 6 · पाठ 1 का 5पाठ्यक्रम में 26/50~12 min
मॉड्यूल पाठ (1/5)

इंटरफेस: एक व्यवहार को परिभाषित करना

गो में एक इंटरफ़ेस विधि हस्ताक्षरों का एक सेट है। एक मूल्य यदि इसमें वे सभी विधियाँ हैं तो यह इंटरफ़ेस लागू करता है - नहीं implements, नहीं extends, कोई स्पष्ट पंजीकरण नहीं। यह है मॉडल को अक्सर "स्ट्रक्चरल टाइपिंग" या "स्टेटिक डक टाइपिंग" कहा जाता है: कंपाइलर कंपाइलेशन समय पर अनुरूपता की जांच करता है, लेकिन इसके आधार पर आकार, घोषणाओं पर नहीं।

एक इंटरफ़ेस घोषित करना

Go
type Greeter interface {
    Greet() string
}

कन्वेंशन: एकल-विधि इंटरफ़ेस के लिए -er पर समाप्त होने वाले नाम (Reader, Writer, Stringer, Closer)। छोटे इंटरफ़ेस (1-2 विधियाँ) मुहावरेदार हैं: मानक पुस्तकालय भरा हुआ है छोटे इंटरफ़ेस जो एक साथ बनते हैं (io.ReadWriter, io.ReadCloser,…).

निहित कार्यान्वयन

Go
type Person struct{ Name string }

func (p Person) Greet() string {
    return "ciao " + p.Name
}

// Person satisfies Greeter because it has the required method.
var s Greeter = Person{Name: "Ada"}
fmt.Println(s.Greet())

कोई कीवर्ड नहीं. यदि प्रकार में विधियाँ हैं, तो इसे सौंपा जा सकता है उस इंटरफ़ेस प्रकार का एक चर। इतना ही।

इंटरफ़ेस के माध्यम से बहुरूपता

Go
type Robot struct{ ID string }
func (r Robot) Greet() string { return "bip " + r.ID }

func greet(s Greeter) {
    fmt.Println(s.Greet())
}

greet(Person{Name: "Ada"})
greet(Robot{ID: "R2"})

greet किसी भी प्रकार को स्वीकार करता है जो Greeter को संतुष्ट करता हो। यह जाने का रास्ता है बहुरूपता करना: कोई पदानुक्रम नहीं, बस क्षमता।

खाली इंटरफ़ेस

Go
var x interface{} = 42
var y any = "ciao"   // any is the built-in alias of interface{}

interface{} (या any गो 1.18 के बाद से) को किसी विधि की आवश्यकता नहीं है, इसलिए कोई भी मूल्य इसे संतुष्ट करता है। सामान्य कंटेनरों के लिए उपयोगी, लेकिन निकालने के लिए ठोस मान के लिए आपको प्रकार का दावा या प्रकार का स्विच चाहिए (अगले पाठ)।

विधि सेट: मान बनाम सूचक रिसीवर (पूर्वावलोकन)

मॉड्यूल 5 से याद करें:

  • वैल्यू रिसीवर वाली विधियाँ T और *T दोनों के विधि सेट में हैं।
  • पॉइंटर रिसीवर वाली विधियाँ केवल *T के विधि सेट में हैं।

व्यावहारिक परिणाम:

Go
type Counter struct{ N int }
func (c *Counter) Inc() { c.N++ }

type Incrementer interface { Inc() }

var i Incrementer = &Counter{}   // OK: *Counter has Inc()
// var j Incrementer = Counter{} // ERROR: Counter (value) does NOT

जब किसी विधि में एक पॉइंटर रिसीवर होता है, तो आपको एक पॉइंटर असाइन करना होगा इंटरफ़ेस चर.

इसे अजमाएं

व्यायाम#go.m6.l1.e1
प्रयास: 0लोड हो रहा है...

एकल विधि Greet() स्ट्रिंग के साथ इंटरफ़ेस Greeter को परिभाषित करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

सिंटैक्स: `प्रकार नाम इंटरफ़ेस { विधि (तर्क) वापसी }`।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#go.m6.l1.e2
प्रयास: 0लोड हो रहा है...

फ़ील्ड आईडी स्ट्रिंग के साथ एक नए प्रकार के रोबोट पर ग्रीटर लागू करें; विधि 'बिप' + आईडी लौटाती है।

संपादक लोड हो रहा है...
संकेत दिखाएँ

कोई `कार्यान्वयन` नहीं: बस सही हस्ताक्षर के साथ विधि को परिभाषित करें।

3 प्रयासों के बाद समाधान उपलब्ध है

Quiz#go.m6.l1.e3
तैयार

आप यह कैसे घोषित करते हैं कि प्रकार P, ग्रीटर इंटरफ़ेस को लागू करता है?

Go
type P struct{}
// ?
उत्तर विकल्प

संक्षिप्त

  • इंटरफ़ेस = विधि हस्ताक्षर का सेट; नहीं implements.
  • निहित कार्यान्वयन: बस सही हस्ताक्षर वाली विधियाँ रखें।
  • मुहावरेदार: छोटे इंटरफेस (1-2 तरीके), -er में नाम।
  • interface{} / any: किसी भी मूल्य को स्वीकार करता है, प्रकार की सुरक्षा खो देता है।
  • विधि सेट: पॉइंटर रिसीवर → केवल *T इंटरफ़ेस को संतुष्ट करता है।
  • बहुरूपता पर जाएं: इंटरफ़ेस-टाइप किए गए पैरामीटर, कोई पदानुक्रम नहीं।