𝗚𝗼 𝗖𝗼𝗻𝘁𝗲𝘅𝘁 𝗣𝗮𝗰𝗸𝗮𝗴𝗲
زیادہ تر Go ڈویلپرز context.Context کو سمجھے بغیر استعمال کرتے ہیں۔ آپ اسے HTTP ہینڈلرز، ڈیٹا بیس کالز، اور SDK میتھڈز میں دیکھتے ہیں۔ بہت سے مبتدی ہر جگہ context.Background() پاس کر دیتے ہیں۔
یہ غلطی مسائل کا باعث بنتی ہے۔ ایک Lambda فنکشن اپنے ٹائم آؤٹ سے آگے بھی ہینگ ہو سکتا ہے۔ ایک ڈیٹا بیس کوئری صارف کے ڈس کنیکٹ ہونے کے بعد بھی چلتی رہ سکتی ہے۔
Context آپ کو اپنے کوڈ کے ذریعے کینسلشن سگنلز اور ڈیڈ لائنز بھیجنے کی اجازت دیتا ہے۔ یہ آپ کو تین سوالات کے جواب دینے میں مدد کرتا ہے:
• کیا یہ آپریشن چلتا رہنا چاہیے؟ • اس آپریشن کو کب ختم ہونا چاہیے؟ • اس کال کے ساتھ کون سا ریکوسٹ ڈیٹا بہہ رہا ہے؟
Context انٹرفیس کے چار میتھڈز ہیں:
Deadline(): بتاتا ہے کہ context کب کینسل ہوگا۔Done(): ایک چینل واپس کرتا ہے جو context کینسل ہونے پر بند ہو جاتا ہے۔ کام روکنے کے لیے اسےselectسٹیٹمنٹس میں استعمال کریں۔Err(): بتاتا ہے کہ context کیوں رکا (DeadlineExceededیاCanceled)۔Value(): ریکوسٹ کے دائرہ کار (request-scoped) کا ڈیٹا حاصل کرتا ہے جیسے کہ Trace ID۔
Context ایک درخت (tree) کے طور پر کام کرتا ہے۔ آپ ایک پیرنٹ context سے شروع کرتے ہیں اور اس کے چائلڈز بناتے ہیں۔
Root Contexts:
context.Background(): اسے اپنے پروگرام کے آغاز میں استعمال کریں۔context.TODO(): ری فیکٹرنگ (refactoring) کے دوران اسے بطور پلیس ہولڈر استعمال کریں۔
Child Contexts:
context.WithCancel(): آپ کو کام کو دستی طور پر روکنے کی اجازت دیتا ہے۔context.WithTimeout(): ایک مخصوص مدت کے بعد کام روک دیتا ہے۔context.WithDeadline(): ایک مخصوص وقت پر کام روک دیتا ہے۔context.WithValue(): User IDs جیسی میٹا ڈیٹا (metadata) پاس کرتا ہے۔
اہم اصول: ہمیشہ cancel فنکشن کو کال کریں۔ چائلڈ context بنانے کے فوراً بعد defer cancel() استعمال کریں۔ اگر آپ اسے چھوڑ دیتے ہیں، تو آپ میموری لیکس (memory leaks) پیدا کر دیتے ہیں۔
Best Practices:
- فنکشنز کو پہلا آرگومنٹ کے طور پر context پاس کریں۔
- context کو structs میں اسٹور نہ کریں۔
context.WithValueکو صرف میٹا ڈیٹا کے لیے استعمال کریں، ڈیٹا بیس کلائنٹس جیسی ڈیپینڈنسیز کے لیے نہیں۔- جلدی باہر نکلنے کے لیے طویل لوپس کے اندر
ctx.Err()چیک کریں۔ - ٹکراؤ (collisions) سے بچنے کے لیے context keys کے لیے کسٹم ٹائپس استعمال کریں۔
جب ایک پیرنٹ context کینسل ہوتا ہے، تو اس کے تمام چائلڈز خود بخود کینسل ہو جاتے ہیں۔ یہ آپ کے پورے سسٹم میں آپریشنز کی ایک پوری زنجیر کو روکنا آسان بنا دیتا ہے۔