الانتقال إلى المحتوى الرئيسي
الوحدة 4 · الدرس 3 من 518/50 في الدورة~12 min
دروس الوحدة (3/5)

الخرائط: المفاتيح والقيم

الخريطة هي مفتاح → جدول تجزئة القيمة: map[K]V. الخرائط ** مرجع ** الأنواع: تم تمريرها إلى دالة، وتشترك في نفس مساحة التخزين. يجب أن يكونوا كذلك تمت تهيئته قبل أن تتمكن من الكتابة إليهم (باستخدام make أو حرفيًا).

الخلق

Go
// with a literal
prices := map[string]int{"pane": 2, "latte": 3}

// with make
counters := make(map[string]int)
counters["a"] = 1

// nil map (readable, NOT writable)
var m map[string]int
fmt.Println(m["x"])    // 0 — ok
// m["y"] = 1          // PANIC

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

Go
m := map[string]int{"a": 1}

m["b"] = 2              // insert/update
v := m["a"]             // get; if missing: zero value
delete(m, "a")          // remove (ok even if the key doesn't exist)
n := len(m)             // number of entries

Comma-ok: التمييز بين "مفقود" و"قيمة صفر"

Go
v, ok := m["x"]
if !ok {
    fmt.Println("key missing")
} else {
    fmt.Println("found:", v)
}

إنها الطريقة الوحيدة لمعرفة ما إذا كان المفتاح موجودًا أم لا، لأن m["x"] يُرجع القيمة صفر حتى عندما لا يكون المفتاح موجودًا. نمط أساسي.

التكرار: ترتيب عشوائي

Go
for k, v := range m {
    fmt.Println(k, v)
}

المفاتيح: الأنواع المماثلة فقط

يجب أن تكون المفاتيح قابلة للمقارنة: string، أرقام، bool، مؤشرات، القنوات والواجهات والمصفوفات من الأنواع المماثلة والهياكل القابلة للمقارنة الحقول. الشرائح والخرائط والوظائف غير قابلة للمقارنة → لا يمكن مقارنتها تكون مفاتيح.

Go
m := map[[2]int]string{}   // ok: array is comparable
// m := map[[]int]string{} // ERROR: slice is not comparable

النمط: عدادات

من أشهر استخدامات الخرائط:

Go
words := []string{"a", "b", "a", "c", "b", "a"}
freq := map[string]int{}
for _, w := range words {
    freq[w]++   // access to a missing key is 0 → 0+1 = 1
}
// freq = {"a": 3, "b": 2, "c": 1}

جربه

تمرين#go.m4.l3.e1
المحاولات: 0جارٍ التحميل…

أنشئ خريطة[string]int بالقيم 'a' -> 1 و'b' -> 2، ثم أضف 'c' -> 3.

جارٍ تحميل المحرر…
إظهار التلميح

حرفيًا: `map[K]V{"key": value, ...}`.

الحل متاح بعد 3 من المحاولات

تمرين#go.m4.l3.e2
المحاولات: 0جارٍ التحميل…

استخدم نمط الفاصلة OK لقراءة المفتاح "x" (غير موجود) في v، ok وطباعة كليهما.

جارٍ تحميل المحرر…
إظهار التلميح

قيمتان مرجعيتان: القيمة والوجود المنطقي.

الحل متاح بعد 3 من المحاولات

Quiz#go.m4.l3.e3
جاهز

ماذا يحدث عند الكتابة إلى خريطة صفرية؟

Go
var m map[string]int
m["a"] = 1
خيارات الإجابة

خلاصة

  • map[K]V: قيمة المفتاح، المرجع، مدعومة بالتجزئة.
  • التهيئة باستخدام make أو حرفيًا؛ خريطة لا شيء → الذعر عند الكتابة.
  • v, ok := m[k] هي الطريقة الوحيدة للتمييز بين "المفقود" و"القيمة صفر".
  • delete(m, k) يزيل؛ حسنًا، حتى لو كان k غير موجود.
  • range التكرار: ترتيب عشوائي.
  • المفاتيح: الأنواع القابلة للمقارنة فقط (بدون شريحة/خريطة/وظيفة).
  • نمط العدادات: freq[k]++ يستفيد من قيمة الصفر الضمنية.