defer والدوال المجهولة وعمليات الإغلاق
الاستدعاءات المؤجلة وقيم الدوال
defer والدوال المجهولة وعمليات الإغلاق درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
defer: التنفيذ المؤجّل
يجدول defer استدعاء دالة ليُنفَّذ عند عودة الدالة المحيطة، بغضّ النظر عن طريقة عودتها (بشكل طبيعي أو بسبب خطأ أو panic):
func readFile(path string) {
f, err := os.Open(path)
if err != nil { return }
defer f.Close() // runs when readFile returns
// read from f...
}ترتيب تقييم defer
تُدفَع الاستدعاءات المؤجّلة إلى مكدس وتُنفَّذ بترتيب LIFO (الأخير دخولًا، الأول خروجًا):
func main() {
defer fmt.Println("third")
defer fmt.Println("second")
defer fmt.Println("first")
// Output: first, second, third
}استخدام defer للتنظيف
يُعدّ defer الأسلوب الاصطلاحي لضمان تحرير الموارد:
- إلغاء قفل mutex بعد قفله
- إغلاق ملف بعد فتحه
- تنفيذ معاملة قاعدة البيانات أو التراجع عنها
- استدعاء WaitGroup.Done() بعد WaitGroup.Add()
defer مع المعاملات
تُقيَّم معاملات الاستدعاء المؤجّل فورًا عند استدعاء defer، وليس عند تنفيذ الاستدعاء:
x := 10
defer fmt.Println(x) // prints 10, not 20
x = 20
fmt.Println(x) // prints 20الدوال المجهولة
تُعرَّف الدوال المجهولة (حرفيات الدوال) مباشرةً من دون اسم:
double := func(n int) int {
return n * 2
}
fmt.Println(double(5)) // 10
// Immediately invoked:
result := func(a, b int) int { return a + b }(3, 4)الإغلاقات
الإغلاق هو دالة تلتقط متغيرات من النطاق المحيط بها:
func makeCounter() func() int {
count := 0
return func() int {
count++
return count
}
}
ctr := makeCounter()
fmt.Println(ctr(), ctr(), ctr()) // 1 2 3مشكلة التقاط الإغلاقات في الحلقات
تلتقط الإغلاقات المتغيرات بالمرجع، مما يسبب خطأً شائعًا في حلقات goroutine:
for i := 0; i < 3; i++ {
i := i // create a new variable per iteration
go func() { fmt.Println(i) }()
}defer مع الإرجاع المسمّى
يمكن للدوال المؤجّلة تعديل قيم الإرجاع المسمّاة، وهذا مفيد لإضافة معلومات إلى الأخطاء:
func doWork() (err error) {
defer func() {
if err != nil {
err = fmt.Errorf("doWork: %w", err)
}
}()
return riskyOp()
}الأنماط الوظيفية باستخدام الإغلاقات
تتيح الإغلاقات أنماطًا وظيفية مثل التخزين المؤقت للحسابات:
func memoize(f func(int) int) func(int) int {
cache := map[int]int{}
return func(n int) int {
if v, ok := cache[n]; ok {
return v
}
v := f(n)
cache[n] = v
return v
}
}الإغلاقات بوصفها برمجية وسيطة
تُعدّ الإغلاقات لبنة البناء للبرمجية الوسيطة في خوادم Go HTTP، إذ تغلّف معالجًا وتضيف سلوكًا حوله:
func withLogging(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
log.Printf("%s %s", r.Method, r.URL)
next(w, r)
}
}تحقّق سريع
متى تُقيَّم معاملات استدعاء الدالة المؤجّلة؟
مراجعة: defer والإغلاقات والدوال المجهولة
تجعل هذه الميزات شيفرة Go أكثر تعبيرًا وأمانًا:
- يضمن
deferالتنظيف عند خروج الدالة، بترتيب LIFO - تُقيَّم معاملات defer فورًا
- يمكن إسناد الدوال المجهولة إلى متغيرات أو استدعاؤها مباشرةً
- تلتقط الإغلاقات المتغيرات المحيطة بالمرجع
- انتبهوا إلى أخطاء التقاط متغيرات الحلقات في goroutines
المقرر التالي: المصفوفات والشرائح والخرائط.
الأسئلة الشائعة
هل درس «defer والدوال المجهولة وعمليات الإغلاق» مجاني؟
نعم — نص درس «defer والدوال المجهولة وعمليات الإغلاق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «defer والدوال المجهولة وعمليات الإغلاق»؟
الاستدعاءات المؤجلة وقيم الدوال تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «defer والدوال المجهولة وعمليات الإغلاق»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات الدوال وتواقيعها
- قيم الإرجاع المتعددة
- الدوال متغيرة المعاملات
- defer والدوال المجهولة وعمليات الإغلاق