في Golang ، الدالة هي مجموعة من العبارات المستخدمة لأداء المهام، مع قيمة إرجاع اختيارية . يدعم Go طريقتين رئيسيتين لتمرير الوسائط: التمرير حسب القيمة والتمرير حسب المرجع. يستخدم Go التمرير بالقيمة بشكل افتراضي.

المصطلحات الأساسية في تمرير المعلمات إلى الوظائف:
- المعلمات الفعلية: الوسائط التي تم تمريرها إلى الدالة.
- المعلمات الرسمية: المعلمات التي تتلقاها الدالة.
على سبيل المثال
package main
import "fmt"
// Cố gắng sửa đổi giá trị của num
func modify(num int) {
num = 50
}
func main() {
num := 20
fmt.Printf("Before, num = %d\n", num)
modify(num)
fmt.Printf("After, num = %d\n", num)
}
في هذا المثال، numيبقى دون تغيير بعد الاستدعاء modifyلأنه يتم تمريره بالقيمة.
بناء الجملة
func functionName(param Type) {
// function body # Gọi theo giá trị
}
func functionName(param *Type) {
// function body # Gọi theo tham chiếu
}
الاتصال حسب القيمة
في استدعاء القيمة، يتم تمرير نسخة من قيمة المعلمة الفعلية. التغييرات التي تم إجراؤها في الوظيفة لا تؤثر على المتغير الأصلي.
بناء الجملة
func functionName(param Type) {
// function body
}
على سبيل المثال:
package main
import "fmt"
// Chỉnh sửa giá trị của num
func modify(num int) {
num = 50
}
func main() {
num := 20
fmt.Printf("Before, num = %d\n", num)
modify(num)
fmt.Printf("After, num = %d\n", num)
}
نتيجة:
Before, num = 20
After, num = 20
تظل القيمة كما هي، حيث أن التغييرات الداخلية modifyلا تؤثر على numالخارج main.
حجج الوظيفة في Golang
الاتصال بالإشارة
في الاستدعاء بالمرجع، يتم تمرير مؤشر إلى المعلمة الفعلية، وبالتالي تنعكس أي تغييرات داخل الوظيفة على المتغير الأصلي.
بناء الجملة
func functionName(param *Type) {
// function body
}
على سبيل المثال:
package main
import "fmt"
// Chỉnh sửa giá trị của num qua tham chiếu
func modify(num *int) {
*num = 50
}
func main() {
num := 20
fmt.Printf("Before, num = %d\n", num)
modify(&num)
fmt.Printf("After, num = %d\n", num)
}
نتيجة
Before, num = 20
After, num = 50
نظرًا لأنه numيتم تمريره عن طريق المرجع، فإن الأمر modifyسيتغير قيمته، وهو ما ينعكس في الأمر main.