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

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

جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 28 من 68.

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

إليك كيف تحدث خريطة (map) من النوع nil وكيف تبدو:

var myMap map[string]int
// myMap هي nil في هذه المرحلة

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

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

// سيؤدي هذا إلى حدوث panic!
myMap["key"] = 42

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

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

يضمن هذا الفحص البسيط عدم توقف برنامجك بشكل مفاجئ عند التعامل مع خرائط (maps) قد لا تكون مهيأة، مما يجعل الكود الخاص بك أكثر قوة وموثوقية.

quiz iconاختبر نفسك

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

quiz iconاختبر نفسك

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

quiz iconاختبر نفسك

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

challenge icon

التحدي

سهل

قم بإنشاء نظام تهيئة خرائط (map) آمن يمنع أخطاء الـ panic من خلال التحقق من الخرائط الفارغة (nil maps) قبل محاولة إجراء عمليات الكتابة. يوضح هذا التحدي الأهمية البالغة للتحقق من حالة الخريطة قبل تنفيذ العمليات التي قد تؤدي إلى تعطل برنامجك.

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

  • سلسلة نصية تمثل عدد العمليات (مثلاً، "5")
  • سلسلة نصية تحتوي على العمليات بالتنسيق التالي: "operation1:key1:value1,operation2:key2:value2" حيث تكون العمليات إما "check"، أو "init"، أو "add" (مثلاً، "check:scores,init:scores,add:Alice:95,add:Bob:87,check:grades")

مهمتك هي:

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

استخدم حزمة strconv لتحويل سلاسل القيم النصية إلى أعداد صحيحة لعمليات الإضافة. يوضح هذا التحدي كيف أن التحقق من الخرائط الفارغة (nil maps) قبل عمليات الكتابة يمنع حدوث runtime panics ويجعل كودك قوياً وموثوقاً.

ورقة مرجعية

الخريطة من النوع nil هي خريطة غير مهيأة لا تشير إلى أي شيء في الذاكرة. محاولة إضافة مفاتيح إلى خريطة nil ستؤدي إلى توقف البرنامج (panic) وانهياره.

التصريح عن خريطة دون تهيئتها ينشئ خريطة nil:

var myMap map[string]int
// myMap هي nil في هذه المرحلة

القراءة من خريطة nil آمنة (تعيد القيمة الصفرية)، لكن الكتابة إليها ستؤدي إلى حدوث panic:

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

// سيؤدي هذا إلى panic!
myMap["key"] = 42

تحقق دائماً ما إذا كانت الخريطة nil قبل إضافة المفاتيح:

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

جرّب بنفسك

package main

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

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

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

جميع دروس Logic & Flow