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

अभिकथन टाइप करें

एक प्रकार का अभिकथन एक इंटरफ़ेस मान से ठोस प्रकार निकालता है। आपको इसकी आवश्यकता तब होती है जब आपके पास interface{} (या "उच्च" इंटरफ़ेस) होता है हाथ और फ़ील्ड तक पहुंचने के लिए इसे अपने विशिष्ट प्रकार के रूप में मानने की आवश्यकता है इंटरफ़ेस पर विधियाँ मौजूद नहीं हैं.

सिंटेक्स

Go
var i interface{} = "ciao"

s := i.(string)           // "panic" form: panics if it's not a string
s, ok := i.(string)       // "comma ok" form: ok = false if it's not a string

दो रूप, दो शब्दार्थ:

फॉर्मसफलताअसफलता
v := i.(T)v = प्रकार T का मानरनटाइम पर घबराहट
v, ok := i.(T)v=..., ok=truev = T का शून्य मान, ok=false

"अल्पविराम ठीक है" फ़ॉर्म: सबसे सुरक्षित

Go
var i interface{} = 42

if s, ok := i.(string); ok {
    fmt.Println("è stringa:", s)
} else {
    fmt.Println("non è stringa, ignoro")
}

ok आपको बिना घबराए "गलत प्रकार" के मामले को संभालने की सुविधा देता है। यह है अधिकांश मामलों में मुहावरेदार पैटर्न।

एक इंटरफ़ेस पर दावा

यह दावा केवल ठोस प्रकारों पर ही नहीं, बल्कि अन्य प्रकारों पर भी काम करता है इंटरफ़ेस:

Go
type Closer interface { Close() error }

func tryClose(x interface{}) {
    if c, ok := x.(Closer); ok {
        c.Close()
    }
}

मानक लाइब्रेरी में एक बहुत ही सामान्य पैटर्न: "यदि मेरा इनपुट भी है एक io.Closer, अंत में बंद करें पर कॉल करें"।

सूचक बनाम मूल्यों पर अभिकथन

दावा बिल्कुल गतिशील प्रकार से मेल खाना चाहिए:

Go
type Cat struct{}
func (c *Cat) Meow() {}

var a interface{} = &Cat{}

c1, ok := a.(*Cat)   // ok = true
c2, ok := a.(Cat)    // ok = false: it holds *Cat, not Cat

*Cat और Cat टाइप सिस्टम के लिए अलग-अलग प्रकार हैं।

अभिकथन बनाम प्रकार स्विच का उपयोग कब करें

  • केवल 1 संभावित प्रकार, "फीचर-डिटेक्ट" चेक (उदाहरण के लिए एक वैकल्पिक इंटरफ़ेस पर कास्ट): प्रकार का दावा comma ok के साथ।
  • 2+ संभावित प्रकार, एकाधिक शाखाओं पर प्रेषण: प्रकार स्विच (अगला पाठ)।

इसे अजमाएं

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

i से एक स्ट्रिंग निकालने के लिए अल्पविराम ठीक पैटर्न का उपयोग करें।

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

सिंटैक्स: `v, ok := i.(T)`.

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

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

बिना अल्पविराम के पूर्णांक में अभिकथन टाइप करें ठीक है (मान लें कि मेरे पास एक पूर्णांक है)।

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

'ओके' के बिना आप मान लेते हैं कि प्रकार निश्चित है; अन्यथा घबराओ.

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

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

यदि i में int है तो `s := i.(string)` के साथ क्या होता है?

Go
var i interface{} = 42
s := i.(string)
उत्तर विकल्प

संक्षिप्त

  • v := i.(T): यदि गतिशील प्रकार ≠ T है तो घबराएं।
  • v, ok := i.(T): सुरक्षित पैटर्न, ok जांचें।
  • किसी अन्य इंटरफ़ेस ("फ़ीचर डिटेक्ट") के विरुद्ध भी काम करता है।
  • T और *T दावे के लिए अलग-अलग प्रकार हैं।
  • 1 प्रकार → दावा; 2+ प्रकार → प्रकार स्विच।