English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
الوظيفةفي Go هي مجموعة من الأوامر المستخدمة لتنفيذ مهام محددة وإعادة النتائج إلى نداءتمرير بالقيمة أو نداء بالقيمةوالتمرير بالمرجع أو تمرير بالمرجع.بافتراض الافتراضي، يستخدم Go طريقة النداء بالقيمة لتمرير المعامل إلى الدوال.
المصطلحات الأساسية لتمرير المعامل إلى الدالة:
المعامل التي يتم تمريرها إلى الدالة تُسمى المعامل الفعلي.
المعامل التي يتلقاها الدالة تُسمى المعامل النموذجي.
في هذه عملية تمرير المعامل، قيمة المعامل الفعلية تُنسخ إلى معامل النموذج، وستخزن كلاهما في مواقع مختلفة. لذلك، أي تغيير يتم القيام به داخل الوظيفة لن يُعكس في المعامل الفعلي للنداء.
مثال 1:في برنامج التالي، يمكنك رؤية أن قيمة Z لا يمكن تبادلها عبر وظيفة Modifyتعديل.
package main import "fmt" //تعديل القيمة func modify(Z int) { Z = 70 } func main() { var Z int = 10 fmt.Printf("قيمة Z قبل نداء الوظيفة = %d", Z) //نداء بالقيمة modify(Z) fmt.Printf("\nقيمة Z بعد نداء الوظيفة = %d", Z) }
الإخراج:
قيمة Z قبل نداء الوظيفة = 10 قيمة Z بعد نداء الوظيفة = 10
مثال 2:في برنامج التالي، لا يمكن للوظيفة تبادل القيم لأننا نستخدم النداء بالقيمة.
package main import "fmt" //交换值的函数 func swap(x, y int) int { //取一个临时变量 var tmp int tmp = x x = y y = tmp return tmp } func main() { var f int = 700 var s int = 900 fmt.Printf("قيمة الوظيفة قبل النداء\n") fmt.Printf("f = %d و s = %d\n", f, s) swap(f, s) fmt.Printf("\nقيمة النداء للوظيفة\n") fmt.Printf("f = %d و s = %d", f, s) }
الإخراج:
قيمة الوظيفة قبل النداء f = 700 و s = 900 قيمة النداء للوظيفة f = 700 و s = 900
في هذا السياق، سستخدمالمراجعالمفهوم. عميل التسلسل * يستخدم لتحديد القيمة في العنوان. عميل العنوان & يستخدم للحصول على عنوان أي متغير من أي نوع. يعمل الم 参数 والمعاملات الشكلية على نفس الموقع، لذا فإن أي تغيير يتم إجراؤه داخل الوظيفة سيظهر في المتغير الفعلي في النداء.
مثال 1:في النداء للوظيفة، نرسل عنوان المتغير ونستخدم عميل التسلسل *لتحديث القيمة. لذلك، أي تغيير يتم إجراؤه داخل الوظيفة سيؤثر على المتغير الفعلي في النداء.بعد التعديل، ستجد القيمة المعدلة.
package main import "fmt" //وظيفة تعديل القيم func modifydata(Z *int) { *Z = 70 } func main() { var Zz int = 10 fmt.Printf("قبل نداء الوظيفة، قيمة Zz هي = %d", Zz) //إرسال عنوان المتغير Z بالمراجع modifydata(&Zz) fmt.Printf("\nبعد نداء الوظيفة، قيمة Zz هي = %d", Zz) }
الإخراج:
قبل نداء الوظيفة، قيمة Zz هي = 10 بعد نداء الوظيفة، قيمة Zz هي = 70
مثال 2:باستخدام النداء بالمراجع، سيتمكن وظيفة تبادل القيم من تبادل القيم، كما هو موضح أدناه.
package main import "fmt" //وظيفة تبادل القيم، تؤشر إلى عدد صحيح func swap(x, y *int) int { //تخزين مؤقت للمتغير var tmp int tmp = *x *x = *y *y = tmp return tmp } func main() { var f int = 700 var s int = 900 fmt.Printf("قيمة الوظيفة قبل النداء\n") fmt.Printf("f = %d و s = %d\n", f, s) //نداء بالمراجع //إرسال عنوان المتغير swap(&f, &s) fmt.Printf("\nقيمة النداء للوظيفة\n") fmt.Printf("f = %d و s = %d", f, s) }
الإخراج:
قيمة الوظيفة قبل النداء f = 700 و s = 900 قيمة النداء للوظيفة f = 900 و s = 700