لا يوجد في لغة Go مفهوم للقيمة الفارغة أو المنعدمة أو غير المعرّفة لقيم المتغيرات. المتغيرات المعلَنة دون قيمة ابتدائية صريحة تأخذ افتراضيًا القيمة الصفرية لنوعها.
القيمة الصفرية للأنواع الأولية مثل القيم المنطقية والأنواع العددية والسلاسل النصية هي false و0 و"" على الترتيب.
المعرّف nil، بمعنى الصفر، هو القيمة الصفرية للأنواع الأكثر تعقيدًا مثل المؤشرات والدوال والواجهات والشرائح والقنوات والخرائط.
يوضّح الجدول التالي القيمة الصفرية لأنواع Go.
| النوع | القيمة الصفرية |
|---|---|
| قيمة منطقية | false |
| عددية | 0 |
| سلسلة نصية | "" |
| مؤشر | nil |
| دالة | nil |
| واجهة | nil |
| شريحة | nil |
| قناة | nil |
| خريطة | nil |
ربما لاحظت أن أنواع البُنى غائبة عن الجدول أعلاه. وذلك لأن القيمة الصفرية لنوع البنية تعتمد على حقوله. تُضبط البُنى على قيمتها الصفرية عندما تُضبط جميع حقولها على قيمتها الصفرية.
مهمتك هي تجهيز نظام تقنية المعلومات في المدينة من أجل تعداد سكاني قادم. وبشكل أكثر تحديدًا، أنت مسؤول عن البرنامج الذي سيعالج البيانات الواردة من موظفي التعداد.
يجب أن يكون البرنامج قادرًا على إنشاء مقيم جديد في النظام عند إعطائه معلومات المقيم. بالإضافة إلى ذلك، ستنشئ دوالًا تتأكد من وجود المعلومات المطلوبة في بيانات المقيم، وتحذف بيانات المقيم. وأخيرًا، ستعدّ المقيمين لتوفير عدد دقيق للتعداد السكاني.
عندما يجمع موظف التعداد معلومات أحد المقيمين، فإنه يحتاج إلى تسجيل ذلك المقيم بإدخال اسمه وعمره وعنوانه في النظام.
نفّذ الدالة NewResident التي تقبل ثلاثة وسائط:
ينبغي أن تُرجع الدالة مؤشرًا إلى بنية Resident تحتفظ بهذه المعلومات.
name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}
NewResident(name, age, address)
// => &{Matthew Sanabria 29 map[street:Main St.]}
قد يتردد المقيمون في تقديم بياناتهم الشخصية إلى موظفي التعداد. وفي هذه الحالات، من الضروري تحديد ما إذا كان المقيم قد قدّم المعلومات المطلوبة ليُحتسب في التعداد.
لكي يُحتسب المقيم، يجب أن يقدّم قيمة غير صفرية لاسمه، وعنوانًا يحتوي على قيمة غير صفرية للمفتاح street.
أما بقية المعلومات، مثل عمر المقيم، فهي اختيارية.
نفّذ الطريقة HasRequiredInfo التي تُرجع قيمة منطقية تشير إلى ما إذا كان المقيم قد قدّم المعلومات المطلوبة.
name := "Matthew Sanabria"
age := 0
address := make(map[string]string)
resident := NewResident(name, age, address)
resident.HasRequiredInfo()
// => false
الحياة تمضي بسرعة والأخطاء تحدث. قد ينتقل مقيم خارج المدينة. وقد يقع موظف التعداد في أخطاء أثناء جمع البيانات. وفي هذه الحالات، من الضروري أن تكون لديك القدرة على حذف بيانات المقيم حتى لا يُحتسب.
نفّذ الطريقة Delete التي تضبط جميع حقول المقيم على قيمتها الصفرية.
name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}
resident := NewResident(name, age, address)
fmt.Println(resident)
// Output: &{Matthew Sanabria 29 map[street:Main St.]}
resident.Delete()
fmt.Println(resident)
// Output: &{ 0 map[]}
الآن بعد أن أصبح النظام يدعم بيانات التعداد، حان الوقت لإجراء التعداد وعدّ المقيمين!
نفّذ الدالة Count التي تقبل وسيطًا واحدًا:
Resident.ينبغي أن تُرجع الدالة عددًا صحيحًا يشير إلى عدد المقيمين الذين احتُسبوا في التعداد. ولا يمكن احتساب المقيم إلا إذا قدّم المعلومات المطلوبة لموظف التعداد.
name1 := "Matthew Sanabria"
age1 := 29
address1 := map[string]string{"street": "Main St."}
resident1 := NewResident(name1, age1, address1)
name2 := "Rob Pike"
age2 := 0
address2 := make(map[string]string)
resident2 := NewResident(name2, age2, address2)
residents := []*Resident{resident1, resident2}
Count(residents)
// => 1
سجّل في Exercism لتتعلّم وتتقن Go عبر 34 مفهومًا166 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.