ماڈیول اسباق (2/5)
دعویٰ ٹائپ کریں۔
ایک قسم کا دعوی انٹرفیس ویلیو سے کنکریٹ کی قسم نکالتا ہے۔
آپ کو اس کی ضرورت ہے جب آپ کے پاس interface{} (یا "اعلی" انٹرفیس) ہو
hand اور اسے فیلڈز تک رسائی کے لیے اس کی مخصوص قسم کے طور پر علاج کرنے کی ضرورت ہے۔
طریقے انٹرفیس پر موجود نہیں ہیں۔
نحو
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=true | v = T کی صفر قدر، ok=false |
"کوما ٹھیک ہے" فارم: سب سے محفوظ
var i interface{} = 42
if s, ok := i.(string); ok {
fmt.Println("è stringa:", s)
} else {
fmt.Println("non è stringa, ignoro")
}ok آپ کو بغیر کسی گھبراہٹ کے "غلط قسم" کا معاملہ سنبھالنے دیتا ہے۔ یہ ہے
زیادہ تر معاملات میں محاوراتی نمونہ۔
انٹرفیس کا دعویٰ
یہ دعویٰ صرف ٹھوس اقسام پر ہی کام نہیں کرتا، بلکہ دیگر پر بھی انٹرفیس:
type Closer interface { Close() error }
func tryClose(x interface{}) {
if c, ok := x.(Closer); ok {
c.Close()
}
}معیاری لائبریری میں ایک بہت عام نمونہ: "اگر میرا ان پٹ بھی ہے۔
ایک io.Closer، آخر میں بند کو کال کریں"۔
پوائنٹرز بمقابلہ اقدار پر دعویٰ
دعویٰ متحرک قسم سے بالکل مماثل ہونا چاہیے:
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+ ممکنہ اقسام، متعدد شاخوں پر بھیجیں: ٹائپ سوئچ (اگلا سبق)۔
اسے آزمائیں
i سے سٹرنگ نکالنے کے لیے کوما اوکے پیٹرن کا استعمال کریں۔
اشارہ دکھائیں۔
نحو: `v، ok := i.(T)`۔
3 کوششوں کے بعد حل دستیاب ہے۔
کوما ٹھیک کے بغیر int میں assertion ٹائپ کریں (فرض کریں کہ میں ایک int پر مشتمل ہے)۔
اشارہ دکھائیں۔
'اوکے' کے بغیر آپ فرض کرتے ہیں کہ قسم یقینی ہے۔ دوسری صورت میں گھبراہٹ.
3 کوششوں کے بعد حل دستیاب ہے۔
اگر میں ایک int پر مشتمل ہو تو `s := i.(string)` کے ساتھ کیا ہوتا ہے؟
var i interface{} = 42
s := i.(string)Recap
v := i.(T): گھبراہٹ اگر متحرک قسم ≠ T۔v, ok := i.(T): محفوظ نمونہ، چیک کریںok۔- دوسرے انٹرفیس ("فیچر کا پتہ لگانے") کے خلاف بھی کام کرتا ہے۔
Tاور*Tدعوے کے لیے الگ الگ اقسام ہیں۔- 1 قسم → دعوی؛ 2+ اقسام → ٹائپ سوئچ۔