في Go، map نوع بيانات مدمج يربط المفاتيح بالقيم.
في لغات البرمجة الأخرى، قد تكون على دراية بمفهوم map كقاموس، أو جدول تجزئة، أو مخزن مفتاح/قيمة، أو مصفوفة ترابطية.
من الناحية التركيبية، يبدو map هكذا:
map[KeyType]ElementType
من المهم أيضًا معرفة أن كل مفتاح فريد، مما يعني أن إسناد المفتاح نفسه مرتين سيؤدي إلى الكتابة فوق قيمة المفتاح المقابل.
لإنشاء خريطة، يمكنك القيام بما يلي:
// With map literal
foo := map[string]int{}
أو
// or with make function
foo := make(map[string]int)
إليك بعض العمليات التي يمكنك إجراؤها على خريطة
// Add a value in a map with the `=` operator:
foo["bar"] = 42
// Here we update the element of `bar`
foo["bar"] = 73
// To retrieve a map value, you can use
baz := foo["bar"]
// To delete an item from a map, you can use
delete(foo, "bar")
إذا حاولت استرداد قيمة مفتاح غير موجود في الخريطة، فستُرجع القيمة الصفرية لنوع القيمة.
قد يربكك هذا، خاصةً إذا كانت قيمة ElementType الافتراضية لديك (على سبيل المثال، 0 لـ int) قيمةً صالحة.
للتحقق مما إذا كان المفتاح موجودًا في الخريطة، يمكنك استخدام
value, exists := foo["baz"]
// If the key "baz" does not exist,
// value: 0; exists: false
لدى أحد أصدقائك متجر بيع بالجملة قديم يُدعى Gross Store. الاسم مأخوذ من كمية البضاعة التي يبيعها المتجر: فكل شيء عنده بوحدة gross. طلب منك صديقك أن تنفّذ نظام نقطة بيع (POS) لمتجره. أولًا، تريد بناء نموذج أولي له. في نموذجك الأولي، سيسجّل نظامك الكمية فقط. أعطاك صديقك قائمة بالقياسات لمساعدتك:
| الوحدة | القيمة |
|---|---|
| quarter_of_a_dozen | 3 |
| half_of_a_dozen | 6 |
| dozen | 12 |
| small_gross | 120 |
| gross | 144 |
| great_gross | 1728 |
لكي تستخدم وحدة القياس، عليك تخزينها في برنامجك.
units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)
تحتاج إلى تنفيذ دالة تُنشئ فاتورة جديدة (فارغة) للعميل.
bill := NewBill()
fmt.Println(bill)
// Output: map[]
لتنفيذ ذلك، ستحتاج إلى:
false إذا لم تكن الوحدة unit المُعطاة موجودة في خريطة units.bill الخاصة بالعميل، مُفهرَسًا باسم العنصر، ثم أرجِع true.unit المُعطاة.bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)
لاحظ أن القيمة المُرجَعة من النوع
bool.
لتنفيذ ذلك، ستحتاج إلى:
false إذا كان العنصر المُعطى غير موجود في الفاتورةfalse إذا لم تكن الوحدة unit المُعطاة موجودة في خريطة units.false إذا كانت الكمية الجديدة أقل من 0.bill ثم أرجِع true.true.bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)
لاحظ أن القيمة المُرجَعة من النوع
bool.
لتنفيذ ذلك، ستحتاج إلى:
0 وfalse إذا لم يكن العنصر item موجودًا في الفاتورة.bill وtrue.bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true
لاحظ أن القيمتين المُرجَعتين من النوعين
intوbool.
سجّل في Exercism لتتعلّم وتتقن Go عبر 34 مفهومًا165 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.