English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في لغة Go، يتم تأخير جملة deferالدالةأو الطريقة أوالدالة المجهولةالتنفيذ، حتى عودة الدالة القريبة. بمعنى آخر، يتم تقييم إدخال دالة تأخير أو طريقة على الفور، ولكنها تنفذ حتى عودة الدالة القريبة. يمكنك استخدام كلمة المفتاح defer لإنشاء طريقة تأخير أو دالة أو دالة مجهولة.
النحو:
// 函数 defer func func_name(parameter_list Type) return_type{ // كود } // طريقة defer func (receiver Type) method_name(parameter_list){ // كود } defer func (parameter_list)(return_type){ // code }()
ملاحظات:
في لغة Go، يُسمح بوجود عدة جمل defer في نفس البرنامج، وتُنفذ بناءً على ترتيب LIFO (آخر إدخال أولاً)، كما هو موضح في مثال 2.
في جملة defer، سيتم تقييم المعلمات عند تنفيذ جملة defer (بدلاً من عند استدعائها).
يُستخدم جملة defer عادة لضمان إغلاق الملفات بعد إكمال معالجتها، وإغلاق القنوات أو التعامل مع حالات الطوارئ في البرنامج.
دعونا نستخدم المثال لمناقشة هذه المفهوم:
مثال 1:
package main import "fmt" // 函数 func mul(a1, a2 int) int { res := a1 * a2 fmt.Println("نتيجة: ", res) return 0 } func show() { fmt.Println("مرحبًا، ar.oldtoolbag.com دروس أساسيات لغة Go") } func main() { // استدعاء دالة mul() // هنا سلوك دالة mul // مثل الدالة العادية mul(23, 45) // استدعاء دالة mul() // باستخدام كلمة المفتاح defer // هنا دالة mul() // هي دالة تأخير defer mul(23, 56) // استدعاء دالة show() show() }
الإخراج:
نتيجة: 1035 مرحبًا، ar.oldtoolbag.com دروس أساسيات لغة Go نتيجة: 1288
شرح الاستخدام:في المثال السابق، لدينا اثنتين تُدعىmul()وshow()الدالة في الدالة. حيثshow()تُستخدم الدوال عادةmain()الدالة في الدالة، ونستدعيها بطرقين مختلفينmul()الدالة:
أولاً، نستدعي الدالة كما هي العادةmulالدالة، أي mul(23,45) وتنفيذها عند استدعاء الدالة (الإخراج: Result: 1035).
ثم، نستخدم كلمة المفتاح defer لتحديدmul()يُدعى هذا الدالة دالة تأخير، أي defer mul( 23،56)، عند عودة جميع الطرق المحيطة، سيتم تنفيذها (الإخراج: Result: 1288).
مثال 2:
package main import "fmt" // 函数 func add(a1, a2 int) int { res := a1 + a2 fmt.Println("نتيجة: ", res) return 0 } func main() { fmt.Println("بداية") // جملات تأخير متعددة // تنفيذ بناءً على ترتيب LIFO defer fmt.Println("نهاية") defer add(34, 56) defer add(10, 10) }
الإخراج:
بداية نتيجة: 20 النتيجة: 90 النهاية