Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التحقق من الـ Nil Maps

جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 28 من 68.

في Go، يمكن أن تكون للخريطة حالة خاصة تُسمّى nil. خريطة nil هي في الأساس خريطة غير مُهيّأة تشير إلى لا شيء في الذاكرة. يُعدّ فهم هذا المفهوم أمرًا بالغ الأهمية، لأن محاولة إضافة مفاتيح إلى خريطة nil ستتسبب في حدوث panic في برنامجك وتعطّله.

إليك كيفية حدوث nil وما يبدو عليه:

var myMap map[string]int
// myMap هي nil في هذه النقطة

عندما تعلن عن متغير map دون تهيئته، يعيّنه Go تلقائيًا إلى nil. يمكنك القراءة بأمان من map بقيمة nil (إذ سيعيد القيمة الصفرية)، لكن محاولة الكتابة إليه ستؤدي إلى panic:

// هذا آمن - يُرجع 0
value := myMap["key"]

// هذا سيسبب panic!
myMap["key"] = 42

لتجنب هذه المشكلة، يجب عليك دائمًا إجراء check لمعرفة ما إذا كانت الخريطة هي nil قبل محاولة إضافة مفاتيح إليها. عملية check بسيطة:

if myMap == nil {
    myMap = make(map[string]int)
}
myMap["key"] = 42 // الآن هذا آمن

يضمن هذا الـ check البسيط ألا يتعطل برنامجك عند التعامل مع maps التي قد لا تكون initialized، مما يجعل كودك أكثر متانة وموثوقية.

challenge icon

التحدي

سهل

أنشئ نظامًا آمنًا لتهيئة map يمنع أخطاء panic من خلال التحقق من وجود map بقيمة nil قبل محاولة تنفيذ عمليات الكتابة. يوضح هذا التحدي الأهمية البالغة للتحقق من حالة map قبل تنفيذ العمليات التي قد تتسبب في تعطل برنامجك.

ستتلقى مدخلين:

  • سلسلة نصية تمثل عدد العمليات (مثلًا، "5")
  • سلسلة نصية تحتوي على عمليات مفصولة بفواصل. يحدد كل operation اسم map الذي يعمل عليه:
    • "check:[map_name]"
    • "init:[map_name]"
    • "add:[map_name]:[key]:[value]"
    على سبيل المثال "check:scores,init:scores,add:scores:Alice:95,add:scores:Bob:87,check:grades"

مهمتك هي:

  1. إنشاء متغيرَي map من النوع map[string]int باسمَي scores وgrades من دون تهيئتهما (ستكون قيمتهما nil)
  2. معالجة كل operation من السلسلة النصية للمدخلات sequentially:
  3. بالنسبة إلى عمليات "check":
    • تحقق مما إذا كانت map المحددة nil
    • اطبع "Map [map_name] is nil" إذا كانت map nil
    • اطبع "Map [map_name] is initialized" إذا لم تكن map nil
  4. بالنسبة إلى عمليات "init":
    • قم بتهيئة map المحددة باستخدام make(map[string]int)
    • اطبع "Initialized map [map_name]"
  5. بالنسبة إلى عمليات "add":
    • تحقق أولًا مما إذا كانت map nil
    • إذا كانت map nil، فاطبع "Cannot add to nil map [map_name]"
    • إذا لم تكن map nil، فأضف زوج key-value واطبع "Added [key]:[value] to [map_name]"
  6. حلّل العمليات من خلال تقسيم السلسلة النصية للمدخلات:
    • قسّم باستخدام الفواصل للحصول على العمليات الفردية
    • لكل operation، قسّم باستخدام النقطتين للحصول على نوع operation والمعاملات
    • حوّل سلسلة value إلى عدد صحيح لعمليات add
  7. بعد معالجة جميع العمليات، اعرض الحالة النهائية لكلتا map:
    • لكل map، إذا كانت nil: "Final state - [map_name]: nil"
    • لكل map، إذا كانت مهيأة: "Final state - [map_name]: [count] entries" حيث إن count هو عدد أزواج key-value
    • اطبع scores أولًا وgrades ثانيًا، بغض النظر عن ترتيب استخدامهما في العمليات

استخدم الحزمة strconv لتحويل سلاسل value إلى أعداد صحيحة لعمليات add. يوضح هذا التحدي كيف أن التحقق من وجود map بقيمة nil قبل عمليات الكتابة يمنع حالات panic أثناء التشغيل ويجعل كودك متينًا وموثوقًا.

جرّب بنفسك

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// اقرأ المدخلات
	var numOpsStr string
	var operationsStr string
	fmt.Scanln(&numOpsStr)
	fmt.Scanln(&operationsStr)
	
	// أعلن عن الخرائط بدون تهيئة (ستكون nil)
	var scores map[string]int
	var grades map[string]int
	
	// قسّم العمليات بفاصلة
	operations := strings.Split(operationsStr, ",")
	
	// TODO: اكتب الكود الخاص بك أدناه
	// عالج كل عملية بالتسلسل
	// تعامل مع عمليات "check" و "init" و "add"
	// لعمليات add، استخدم strconv.Atoi() لتحويل سلسلة القيمة إلى عدد صحيح
	
	// أخرج الحالة النهائية لكلا الخريطتين
	// تحقق مما إذا كانت الخرائط nil أو مهيأة واطبع وفقًا لذلك
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم Go عبر الإنترنت