في Go، تعمل عبارات defer على تأخير تنفيذ وظيفة أو طريقة أو طريقة مجهولة حتى تعود الوظائف القريبة. بعبارة أخرى، يتم تقييم الوسائط لتأجيل الوظائف أو الأساليب على الفور، ولكنها لا يتم تنفيذها حتى تعود الوظائف القريبة. بإمكانك إنشاء طريقة مؤجلة أو دالة أو دالة مجهولة باستخدام كلمة defer الأساسية.

بناء الجملة:
// Hàm
defer func func_name(parameter_list Type)return_type{
// Code
}
// Phương thức
defer func (receiver Type) method_name(parameter_list){
// Code
}
defer func (parameter_list)(return_type){
// code
}()
ملاحظة هامة:
- في لغة Go، يُسمح باستخدام عبارات defer متعددة في نفس البرنامج ويتم تنفيذها حسب ترتيب LIFO (Last-In, First-Out) كما هو موضح في المثال 2.
- في عبارات التأجيل، يتم تقييم الوسائط عند تنفيذ عبارة التأجيل، وليس عند استدعائها.
- غالبًا ما يتم استخدام عبارات التأجيل للتأكد من إغلاق الملفات عند انتهاء الحاجة إليها، أو لإغلاق القنوات، أو للقبض على المشكلات في البرنامج.
الآن دعونا نلقي نظرة على مثال لفهم أفضل.
مثال 1:
// Chương trình Go minh họa
// khái niệm của lệnh defer
package main
import "fmt"
// Các hàm
func mul(a1, a2 int) int {
res := a1 * a2
fmt.Println("Result: ", res)
return 0
}
func show() {
fmt.Println("Hello!, Quantrimang.com")
}
// Hàm chính
func main() {
// Gọi hàm mul()
// Tại đây hàm mul hoạt động
// như một hàm bình thường
mul(23, 45)
// Gọi hàm mul()
// Dùng từ khóa defer
// Hàm the mul()
// là hàm defer
defer mul(23, 56)
// Gọi hàm show()
show()
}
نتيجة:
Result: 1035
Hello!, Quantrimang.com
Result: 1288
التوضيح: في المثال أعلاه، لدينا دالتين باسم mul() و show() . في حين يتم استدعاء الدالة show() بشكل طبيعي في الدالة main() ، يتم استدعاء الدالة mul() بطريقتين مختلفتين:
- أولاً، نقوم باستدعاء الدالة mul بشكل طبيعي (بدون كلمة defer)، أي mul(23, 45) ويتم تنفيذها عند استدعاء الدالة (الإخراج: النتيجة: 1035).
- ثانيًا، نستدعي الدالة mul() كدالة defer باستخدام الكلمة الأساسية defer، أي defer mul(23, 56) وتنفذ (الإخراج: النتيجة: 1288) عندما تعود جميع الطرق المحيطة.
مثال 2:
// Minh họa chương trình Go
// dùng nhiều lệnh defer, để minh họa chính sách LIFO
package main
import "fmt"
// Các hàm
func add(a1, a2 int) int {
res := a1 + a2
fmt.Println("Result: ", res)
return 0
}
// Hàm chính
func main() {
fmt.Println("Start")
// Nhiều lệnh defer
// Triển khai theo thứ tự LIFO
defer fmt.Println("End")
defer add(34, 56)
defer add(10, 10)
}
نتيجة:
Start
Result: 20
Result: 90
End