"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا تؤثر "التأجيل" على قيم الإرجاع المسماة بشكل مختلف عن معلمات الإدخال في GO؟

لماذا تؤثر "التأجيل" على قيم الإرجاع المسماة بشكل مختلف عن معلمات الإدخال في GO؟

نشر في 2025-03-04
تصفح:583

Why Does `defer` Affect Named Return Values Differently Than Input Parameters in Go?

فهم تأثيرات التأجيل على الإعلانات المتغيرة في GO

في GO ، يسمح استخدام الكلمة الرئيسية المؤجلة بالوظائف بتنفيذ رمز في وقت عودتها ، حتى إذا حدث الذعر. ومع ذلك ، عندما يتعلق الأمر بالمتغيرات المعلنة بطرق مختلفة داخل وظيفة ما ، يمكن أن تختلف النتائج ، مما يؤدي إلى الارتباك. تأجيل func () {i} () العودة أنا } Func Main () { fmt.println (c (0)) // prints 0 }

في هذا المثال ، نسمي الوظيفة C ونمررها القيمة 0. ومع ذلك ، عندما نطبع النتيجة ، نحصل على 0 بدلاً من 1 متوقع. وذلك لأنني أعلن كمعلمة إدخال إلى الوظيفة. بمجرد تنفيذ عبارة الإرجاع ، يتم استدعاء وظيفة التأجيل ، ولكن لا يكون للزيادة أي تأثير على قيمة الإرجاع. تأجيل func () {i} () العودة أنا } Func Main () { fmt.println (c1 ()) // المطبوعات 1 }

هنا ، تم إعلانني كمعلمة نتيجة لوظيفة C1. عند تنفيذ عبارة الإرجاع ، يتم تعيين قيمة I على قيمة الإرجاع. ومع ذلك ، لا يزال مسموحًا بوظيفة التأجيل بتعديل قيمة I قبل إرجاعها. ينتج عن هذا الإخراج 1. تأجيل func () {i} () العودة 2 } Func Main () { fmt.println (c2 ()) // prints 3 }

func c(i int) int {
    defer func() { i   }()
    return i
}

func main() {
    fmt.Println(c(0)) // Prints 0
}
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3