في 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 على مؤشر للبيانات الأساسية، لذا فإن التغييرات داخل الدالة تؤثر على الخريطة الأصلية.