التحقق من الـ 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، مما يجعل كودك أكثر متانة وموثوقية.
التحدي
سهلأنشئ نظامًا آمنًا لتهيئة 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"
مهمتك هي:
- إنشاء متغيرَي map من النوع
map[string]intباسمَيscoresوgradesمن دون تهيئتهما (ستكون قيمتهما nil) - معالجة كل operation من السلسلة النصية للمدخلات sequentially:
- بالنسبة إلى عمليات
"check":- تحقق مما إذا كانت map المحددة nil
- اطبع
"Map [map_name] is nil"إذا كانت map nil - اطبع
"Map [map_name] is initialized"إذا لم تكن map nil
- بالنسبة إلى عمليات
"init":- قم بتهيئة map المحددة باستخدام
make(map[string]int) - اطبع
"Initialized map [map_name]"
- قم بتهيئة map المحددة باستخدام
- بالنسبة إلى عمليات
"add":- تحقق أولًا مما إذا كانت map nil
- إذا كانت map nil، فاطبع
"Cannot add to nil map [map_name]" - إذا لم تكن map nil، فأضف زوج key-value واطبع
"Added [key]:[value] to [map_name]"
- حلّل العمليات من خلال تقسيم السلسلة النصية للمدخلات:
- قسّم باستخدام الفواصل للحصول على العمليات الفردية
- لكل operation، قسّم باستخدام النقطتين للحصول على نوع operation والمعاملات
- حوّل سلسلة value إلى عدد صحيح لعمليات add
- بعد معالجة جميع العمليات، اعرض الحالة النهائية لكلتا map:
- لكل map، إذا كانت nil:
"Final state - [map_name]: nil" - لكل map، إذا كانت مهيأة:
"Final state - [map_name]: [count] entries"حيث إن count هو عدد أزواج key-value - اطبع
scoresأولًا وgradesثانيًا، بغض النظر عن ترتيب استخدامهما في العمليات
- لكل map، إذا كانت nil:
استخدم الحزمة 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 أو مهيأة واطبع وفقًا لذلك
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكياتتدرّب بنفسك: مترجم Go عبر الإنترنت