English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Golang تعليمية أساسية

Golang جملة التحكم

Golang وظيفة & طريقة

Golang هيكل

Golang قطعة & مصفوفة

Golang نص (String)

Golang مرجع

Golang واجهة

Golang تنسيق

Golang استثناء (Error)

Golang غير متعلقة

معاملات وظائف Go

الوظيفةفي 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