ماڈیول اسباق (5/5)
`موخر`: ضمانت شدہ صفائی
defer ایک کال کے عمل کو **انکلوڈنگ فنکشن تک ملتوی کرتا ہے
واپسی **. یہ چلتا ہے یہاں تک کہ اگر فنکشن گھبراہٹ کے ذریعے باہر نکلتا ہے۔ متعدد defers
اسی فنکشن میں LIFO آرڈر میں عمل کریں (لاسٹ ان، فرسٹ آؤٹ)۔
یہ وسائل کی صفائی کے لیے محاوراتی طریقہ کار ہے: فائلوں کو بند کرنا، mutexes کو غیر مقفل کرنا، کنکشن جاری کرنا، حالت کو بحال کرنا۔
نحو اور کیننیکل استعمال کیس
f, err := os.Open(path)
if err != nil {
return err
}
defer f.Close() // chiamata SEMPRE all'uscita della funzione
// ... usa f liberamente ...
return nilعام: f.Close()، mu.Unlock()، db.Close()، tx.Rollback()،
recover()
دلائل کا فوری جائزہ لیا گیا، پھانسی ملتوی کر دی گئی۔
جب آپ defer foo(x) لکھتے ہیں، تو x کا اندازہ اس وقت کیا جاتا ہے
defer، عملدرآمد کے وقت نہیں:
x := 10
defer fmt.Println(x) // cattura 10
x = 99
// quando la funzione ritorna stampa "10", non "99"LIFO آرڈر
سب سے حالیہ کے ساتھ شروع ہونے والے اسٹیک اپ اور عملدرآمد کو ڈیفرس:
defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)
// output: 3, 2, 1یہ وسائل کے الفاظ کے ساتھ مطابقت رکھتا ہے: آخری کھولا ہوا پہلا ہے۔ بند ہونا
defer + recover: گھبراہٹ کو سنبھالنا
defer ایک panic کو روکنے کا واحد طریقہ ہے:
func safe() {
defer func() {
if r := recover(); r != nil {
fmt.Println("recuperato:", r)
}
}()
panic("boom")
}نقصان: defer ایک لوپ میں
defer f.Close() کو ایک لوپ میں ڈالنے سے ** کے اختتام تک ڈیفرز جمع ہو جاتے ہیں
فنکشن**، ہر تکرار کا نہیں۔ ایک لمبی لوپ میں آپ بہت سی فائلیں کھولتے ہیں۔
اور انہیں صرف اس وقت بند کریں جب فنکشن ختم ہوجائے: فائل ڈسکرپٹر کے لیک ہونے کا خطرہ۔
// MALE: defer accumulati
for _, path := range paths {
f, _ := os.Open(path)
defer f.Close() // chiude TUTTI alla fine della funzione esterna
// ...
}
// MEGLIO: estrai in una funzione
for _, path := range paths {
elabora(path) // ogni chiamata ha il proprio scope di defer
}اسے آزمائیں
'inizio' پرنٹ کریں، پھر 'fine' کے پرنٹ کو defer کے ساتھ موخر کریں، پھر 'mezzo' پرنٹ کریں۔ آؤٹ پٹ ہونا چاہیے: inizio/mezzo/ fine.
اشارہ دکھائیں۔
ڈیفر اس وقت چلتا ہے جب main() واپس آنے والا ہو۔
3 کوششوں کے بعد حل دستیاب ہے۔
کوڈ میں اس ترتیب میں 1، 2 اور 3 پرنٹ کرنے والے لگاتار تین ڈیفرز لکھیں۔ آؤٹ پٹ 3/2/1 (LIFO) ہوگا۔
اشارہ دکھائیں۔
ترتیب میں تین التوا؛ یاد رکھیں کہ وہ معکوس ترتیب میں انجام دیتے ہیں۔
3 کوششوں کے بعد حل دستیاب ہے۔
یہ کیا پرنٹ کرتا ہے؟ (نوٹ: التوا کے دلائل کا فوری جائزہ لیا جاتا ہے)
x := 10
defer fmt.Println(x)
x = 99Recap
defer call()فنکشن کے واپس آنے تک عمل کو ملتوی کر دیتا ہے۔- متعدد ڈیفرز = LIFO آرڈر۔
- دلائل کا فوری جائزہ لیا گیا، پھانسی ملتوی کردی گئی۔
- ڈیٹرمنسٹک کلین اپ کے لیے استعمال کیا جاتا ہے: فائلیں، میوٹیکس، کنکشن۔
defer+recover()ایکpanicکو روکتا ہے (شاذ و نادر، حدود پر)۔- کبھی بھی
deferایک طویل لوپ کے اندر نہیں: یہ اس وقت تک جمع ہوتا رہتا ہے جب تک کہ بیرونی فنکشن واپس نہ آجائے۔