مرکزی مواد پر جائیں
ماڈیول 6 · سبق 2 از 5کورس میں 27/50~10 min
ماڈیول اسباق (2/5)

دعویٰ ٹائپ کریں۔

ایک قسم کا دعوی انٹرفیس ویلیو سے کنکریٹ کی قسم نکالتا ہے۔ آپ کو اس کی ضرورت ہے جب آپ کے پاس interface{} (یا "اعلی" انٹرفیس) ہو hand اور اسے فیلڈز تک رسائی کے لیے اس کی مخصوص قسم کے طور پر علاج کرنے کی ضرورت ہے۔ طریقے انٹرفیس پر موجود نہیں ہیں۔

نحو

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لوڈ ہو رہا ہے…

کوما ٹھیک کے بغیر int میں assertion ٹائپ کریں (فرض کریں کہ میں ایک int پر مشتمل ہے)۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

'اوکے' کے بغیر آپ فرض کرتے ہیں کہ قسم یقینی ہے۔ دوسری صورت میں گھبراہٹ.

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m6.l2.e3
تیار

اگر میں ایک int پر مشتمل ہو تو `s := i.(string)` کے ساتھ کیا ہوتا ہے؟

Go
var i interface{} = 42
s := i.(string)
جواب کے اختیارات

Recap

  • v := i.(T): گھبراہٹ اگر متحرک قسم ≠ T۔
  • v, ok := i.(T): محفوظ نمونہ، چیک کریں ok۔
  • دوسرے انٹرفیس ("فیچر کا پتہ لگانے") کے خلاف بھی کام کرتا ہے۔
  • T اور *T دعوے کے لیے الگ الگ اقسام ہیں۔
  • 1 قسم → دعوی؛ 2+ اقسام → ٹائپ سوئچ۔