الأساسيات

الخرائط Maps

– ماهي الخريطة map في غو ؟

الخريطة هي أحد طرق تحزيم وجمع البيانات, شبيهة بـ الشرائح و المصفوفات, وهي أيضاً تُعد أنها نوع بيانات .
حيث تحوي الخريطة على أزواج من البيانات (key-value)

-إنشاء خريطة

يمكننا إنشاء خريطة عبر الدالة make حيث نحدد نوع بيانات المفاتيح keys ونوع بيانات القيم values

personSalary := make(map[string]int)

السطر أعلاه يقوم بإنشاء خريطة باسم personSalary حيث أن المفاتيح فيها من نوع بيانات النصوص string والقيم من نوع بيانات الأعداد int

– إضافة البيانات للخريطة

مثال

package main

import (
"fmt"
)

func main() {
personSalary := make(map[string]int)
personSalary["steve"] = 12000
personSalary["jamie"] = 15000
personSalary["mike"] = 9000
fmt.Println("personSalary map contents:", personSalary)
}

والنتيجة تكون

personSalary map contents: map[steve:12000 jamie:15000 mike:9000]

ويوجد طريقة اخرى لانشاء الخرائط وإضافة البيانات إليها بنفس الكود

package main

import (
"fmt"
)

func main() {
personSalary := map[string]int {
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("personSalary map contents:", personSalary)
}

والأمثلة أعلاه أظن أنها واضحة ومباشرة.

لكن ماذا لو حاولنا طباعة قيمة غير موجودة أصلاً في الخريطة؟
في هذه الحالة فلن يظهر لنا خطأ ولكن سيتم طباعة القيمة الصفرية

مثال

package main

import (
"fmt"
)

func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
employee := "jamie"
fmt.Println("Salary of", employee, "is", personSalary[employee])
fmt.Println("Salary of joe is", personSalary["joe"])
}

والنتيجة ستكون

Salary of jamie is 15000
Salary of joe is 0

– إظهار كافة عناصر الخريطة

يمكننا ذلك عبر حلقة for (مع أو بدون) صيغة range
مثال

package main

import (
"fmt"
)

func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("All items of a map")
for key, value := range personSalary {
fmt.Printf("personSalary[%s] = %d\n", key, value)
}

}

والنتيجة ستكون

All items of a map
personSalary[mike] = 9000
personSalary[steve] = 12000
personSalary[jamie] = 15000

ملاحظة: عند استخدام حلقة for مع range لعرض كافة عناصر الخريطة, يتم ترتيب العناصر عشوائياً في كل مرة, أي أنها لايُعتمد عليها اذا كان الترتيب مهم بالنسبة لبرنامجك.

– حذف عناصر من الخريطة

يمكننا ذلك عبر دالة delete وتحديد الـkey الخاص بالعنصر المراد حذفه
مثال

package main

import (
"fmt"
)

func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("map before deletion", personSalary)
delete(personSalary, "steve")
fmt.Println("map after deletion", personSalary)

}

والنتيجة ستكون

map before deletion map[steve:12000 jamie:15000 mike:9000]
map after deletion map[mike:9000 jamie:15000]

– طول الخريطة Map Length

طول الخريطة يعني عدد العناصر فيها, ويمكننا معرفته عبر الدالة len (كما في المصفوفات و الشرائح)
مثال

package main

import (
"fmt"
)

func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("length is", len(personSalary))

}

النتيجة

length is 3

– الخرائط هي مراجع reference types

كما هو الحال في الشرائح, فعندما ننشئ خريطة وننسبها لمتغير, فعند تغيير قيمة أحد العناصر عبر المتغير, يتغير أيضاً في الخريطة الاصلية
مثال

package main

import (
"fmt"
)

func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("Original person salary", personSalary)
newPersonSalary := personSalary
newPersonSalary["mike"] = 18000
fmt.Println("Person salary changed", personSalary)

}

والنتيجة

Original person salary map[steve:12000 jamie:15000 mike:9000]
Person salary changed map[steve:12000 jamie:15000 mike:18000]
ملاحظة: يمكنك تشغيل أكواد وأمثلة لغة غو من خلال GoLang Playground أو GoPlay.Space .

نبذة عن الكاتب

Firas M. Darwish

Software Engineer, PHP/Laravel, C#, GoLang, founder of ArGoLang.com & others ..

شاركنا رأيك :)