WithDeadline وWithValue
المواعيد النهائية المطلقة وتمرير القيم الخاصة بالطلب
WithDeadline وWithValue درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
context.WithDeadline
ينشئ WithDeadline سياقًا يُلغى عند وقت مطلق محدد. إذا كان لدى السياق الأب مهلة نهائية أسبق، تكون مهلة الأب هي المعتمدة.
deadline := time.Now().Add(10 * time.Second)
ctx, cancel := context.WithDeadline(parent, deadline)
defer cancel()WithTimeout مقابل WithDeadline
WithTimeout(parent, d) مكافئة لـ WithDeadline(parent, time.Now().Add(d)). استخدموا WithDeadline عندما تكون لديكم مهلة زمنية مطلقة للانتهاء، مثل تلك الواردة في ترويسة RPC.
قراءة المهلة الزمنية
افحصوا المهلة الزمنية لأي سياق باستخدام ctx.Deadline(). وتحدد القيمة المنطقية ما إذا كانت هناك مهلة زمنية أم لا.
if deadline, ok := ctx.Deadline(); ok {
fmt.Println("expires at:", deadline)
}context.WithValue
تُرفق WithValue زوجًا من مفتاح وقيمة بالسياق. ويسترجعها الكود اللاحق باستخدام ctx.Value(key).
type ctxKey string
const userKey ctxKey = "user"
ctx := context.WithValue(parent, userKey, currentUser)
func getUser(ctx context.Context) *User {
u, _ := ctx.Value(userKey).(*User)
return u
}منع تصادم المفاتيح
استخدموا نوعًا غير مُصدَّر خاصًا بالحزمة للمفاتيح لمنع التصادم بين الحزم. لا تستخدموا الأنواع المضمّنة مثل (string, int) مباشرةً كمفاتيح للسياق.
// Bad: string key can collide
ctx = context.WithValue(ctx, "user", u)
// Good: package-scoped type
type userKeyType struct{}
ctx = context.WithValue(ctx, userKeyType{}, u)ما الذي يُخزَّن في السياق
خزّنوا فقط القيم الخاصة بالطلب التي تعبر حدود واجهات API، مثل معرّفات التتبّع ورموز المصادقة ومعرّفات الطلبات. لا تخزّنوا معاملات الدوال الاختيارية أو الحالة القابلة للتغيير.
أداء WithValue
ينفّذ ctx.Value بحثًا خطيًا صعودًا عبر سلسلة السياق. تجنّبوا تخزين قيم كثيرة في كل سياق؛ وللقيم المتعددة، اجمعوها في بنية struct واحدة.
type RequestMeta struct {
UserID int
TraceID string
}
type metaKey struct{}
ctx = context.WithValue(ctx, metaKey{}, RequestMeta{...})تمرير القيم عبر البرمجيات الوسيطة
تُعدّ البرمجيات الوسيطة الخاصة بـ HTTP المكان المعتاد لإرفاق البيانات الوصفية للطلب بالسياق واسترجاعها في معالجات الطلبات:
func Auth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
user := authenticate(r)
ctx := context.WithValue(r.Context(), userKey, user)
next.ServeHTTP(w, r.WithContext(ctx))
})
}r.WithContext
استبدلوا سياق طلب HTTP باستخدام r.WithContext(ctx). ينشئ ذلك نسخة سطحية من الطلب بالسياق الجديد، مع إبقاء الطلب الأصلي دون تعديل.
تمرير المهلة الزمنية
عندما تضبط بوابةٌ مهلةً زمنيةً في السياق وتمرّر الطلب إلى خدمة لاحقة، تحترم جميع الخدمات التي تقبل السياق هذه المهلة تلقائيًا دون الحاجة إلى منطق صريح للمهلة الزمنية.
سلسلة السياقات
تغلّف كل من WithValue وWithCancel وWithTimeout السياق الأب في عقدة جديدة. ويتنقّل ctx.Value عبر السلسلة حتى يعثر على المفتاح أو يصل إلى سياق جذر يعيد nil.
اختبار سريع
لماذا ينبغي أن تكون مفاتيح السياق أنواعًا غير مُصدَّرة خاصة بالحزمة؟
مراجعة: WithDeadline وWithValue
النقاط الرئيسية:
- تلغي WithDeadline التنفيذ عند وقت مطلق؛ أما WithTimeout فتعتمد على مدة نسبية
- تقرأ ctx.Deadline() المهلة الزمنية
- استخدموا WithValue للبيانات الوصفية الخاصة بالطلب، مع مفاتيح مكتوبة النوع وغير مُصدَّرة
- اجمعوا القيم المتعددة في بنية struct لتقليل عمق السلسلة
الأسئلة الشائعة
هل درس «WithDeadline وWithValue» مجاني؟
نعم — نص درس «WithDeadline وWithValue» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «WithDeadline وWithValue»؟
المواعيد النهائية المطلقة وتمرير القيم الخاصة بالطلب تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «WithDeadline وWithValue»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا يوجد context.Context؟
- WithCancel وWithTimeout
- WithDeadline وWithValue
- السياق في استدعاءات HTTP وقواعد البيانات