Avatar ·

في Go، الخريطة تُمرر بالقيمة أم بالمرجع؟ لماذا التغييرات داخل الدالة تظهر خارجها؟

مرحبًا بالجميع! لقد بدأت للتو في تعلم Go ولا أستطيع فهم كيفية تمرير map إلى الدوال. كتبت هذا الكود: ```go package main import "fmt" func modifyMap(m map[string]int) { m["key"] = 42 fmt.Println("داخل الدالة:", m) } func main() { myMap := map[string]int{"key": 0} fmt.Println("قبل الاستدعاء:", myMap) modifyMap(myMap) fmt.Println("بعد الاستدعاء:", myMap) } ``` الإخراج: ``` قبل الاستدعاء: map[key:0] داخل الدالة: map[key:42] بعد الاستدعاء: map[key:42] ``` كنت أتوقع أن يتم تمرير map بالقيمة (مثل int أو string)، وأن التغييرات داخل الدالة لن تؤثر على map الأصلية. لكنها تؤثر! بينما، إذا حاولت فعل الشيء نفسه مع مصفوفة: ```go func modifyArray(arr [3]int) { arr[0] = 100 } func main() { a := [3]int{1, 2, 3} modifyArray(a) fmt.Println(a) // [1 2 3] — بدون تغيير! } ``` فإن المصفوفة تتصرف كقيمة عادية. ما الفرق؟ يتم تمرير map كمرجع (reference) في الواقع، حيث تحتوي map على مؤشر للبيانات الأساسية، لذا فإن التغييرات داخل الدالة تؤثر على الخريطة الأصلية.