لماذا يوجد context.Context؟
إدارة الإلغاء ودورة حياة الطلب
لماذا يوجد context.Context؟ درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
المشكلة
من دون آلية لإلغاء العمل الجاري، تحجب استعلامات قاعدة البيانات أو استدعاءات HTTP البطيئة goroutine الخاصة بها حتى اكتمالها، ما يهدر الموارد إذا كان الطلب الأصلي قد أُهمل بالفعل.
نظرة عامة على context.Context
context.Context هي واجهة تحمل إشارة إلغاء، ومهلة نهائية اختيارية، وبيانات وصفية على شكل أزواج مفتاح-قيمة عبر حدود واجهات API وgoroutines.
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key any) any
}قناة Done
تعيد ctx.Done() قناةً تُغلق عند إلغاء السياق أو انتهاء مهلته. وتستخدم goroutines تعليمة select عليها لاكتشاف الإلغاء.
select {
case result := <-workCh:
return result, nil
case <-ctx.Done():
return nil, ctx.Err()
}context.Background()
context.Background() هو السياق الجذري — لا يُلغى مطلقًا، ولا يملك مهلة نهائية، ولا يحمل قيمًا. استخدمه في بداية الطلب، أو في main، أو في الاختبارات.
context.TODO()
context.TODO() هو أيضًا سياق جذري غير قابل للإلغاء، ويُستخدم كعنصر نائب عندما لا يكون السياق الصحيح متاحًا بعد. وهو يوضح النية للمراجعين.
لماذا يُمرَّر Context كوسيط أول؟
وفقًا لل convention، يكون الوسيط الأول لأي دالة يمكن إلغاؤها هو ctx context.Context. وهذا يجعل الإلغاء واضحًا وسهل الاكتشاف في واجهات API.
func FetchUser(ctx context.Context, id int) (*User, error) {
return db.QueryContext(ctx, "SELECT ...", id)
}ينتشر الإلغاء
يؤدي إلغاء سياق أب إلى إلغاء جميع سياقات الأبناء المشتقة منه. ويتيح ذلك لاستدعاء إلغاء واحد إيقاف شجرة كاملة من goroutines والعمليات.
ما لا يمثّله Context
ليس Context حاوية عامة للقيم — استخدمه فقط للبيانات المرتبطة بالطلب، مثل معرّفات التتبع أو رموز المصادقة، وليس للمعاملات الاختيارية. احتفظ بالقيم داخل بنى ذات أنواع محددة.
التكامل مع المكتبة القياسية
يقبل عميل HTTP وبرنامج تشغيل SQL وgRPC في المكتبة القياسية، إلى جانب العديد من الحزم التابعة لجهات خارجية، Context، ما يتيح انتشار الإلغاء عبر مكدس الاستدعاءات بالكامل.
تخزين Context في بنية
لا تخزّن Context داخل بنية. مرّره صراحةً كوسيط دالة. فتخزينه يجعل مدة الإلغاء غير واضحة، وغالبًا ما يؤدي إلى أخطاء.
Context غير قابل للتغيير
Context غير قابل للتغيير — اشتق سياقات جديدة بتغليف السياق باستخدام WithCancel أو WithDeadline أو WithTimeout أو WithValue. ولا يُعدّل السياق الأب.
اختبار سريع
ماذا تعيد ctx.Done()؟
مراجعة: context.Context
النقاط الأساسية:
- يحمل الإلغاء والمهلة النهائية والبيانات الوصفية عبر goroutines
- مرّره كوسيط أول؛ ولا تخزّنه في البنى مطلقًا
- تُغلق قناة ctx.Done() عند الإلغاء أو انتهاء المهلة
- ينتشر الإلغاء من الأب إلى جميع الأبناء
الأسئلة الشائعة
هل درس «لماذا يوجد context.Context؟» مجاني؟
نعم — نص درس «لماذا يوجد context.Context؟» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «لماذا يوجد context.Context؟»؟
إدارة الإلغاء ودورة حياة الطلب تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «لماذا يوجد context.Context؟»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا يوجد context.Context؟
- WithCancel وWithTimeout
- WithDeadline وWithValue
- السياق في استدعاءات HTTP وقواعد البيانات