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

القيم الصفرية والافتراضية

جزء من قسم Object Oriented Programming في رحلة GO على Coddy — الدرس 17 من 107.

في لغة Go، يمتلك كل متغير قيمة صفرية (zero value) — وهي القيمة الافتراضية التي يتم تعيينها عند التصريح عن متغير دون تهيئة صريحة. يعد فهم القيم الصفرية أمراً ضرورياً للعمل مع الهياكل (structs)، حيث تتلقى الحقول غير المهيأة هذه القيم الافتراضية تلقائياً.

لكل نوع قيمته الصفرية الخاصة به:

النوعالقيمة الصفرية
int, float640
string"" (سلسلة نصية فارغة)
boolfalse
pointer, slice, mapnil

عندما تقوم بإنشاء struct، فإن أي حقل لا تقوم بتعيينه بشكل صريح يحصل على قيمته الصفرية (zero value).

type User struct {
    Name   string
    Age    int
    Active bool
}

func main() {
    var u User
    fmt.Println(u.Name)   // "" (سلسلة نصية فارغة)
    fmt.Println(u.Age)    // 0
    fmt.Println(u.Active) // false
}

ينطبق هذا أيضًا على التهيئة الجزئية. فقط الحقول التي تحددها تحصل على قيم مخصصة.

u := User{Name: "Alice"}
fmt.Println(u.Age)    // 0
fmt.Println(u.Active) // false

تجعل القيم الصفرية (Zero values) الهياكل (structs) قابلة للاستخدام فوراً دون الحاجة إلى تهيئة صريحة. ومع ذلك، كن حذراً مع الأنواع المرجعية (reference types) مثل الـ slices والـ maps — فقيمتها الصفرية هي nil، مما قد يتسبب في حدوث runtime panics إذا حاولت استخدامها دون تهيئة.

challenge icon

التحدي

سهل

لنقم ببناء نظام ملف تعريف لاعب يوضح كيفية عمل القيم الصفرية (zero values) في لغة Go. ستقوم بإنشاء ملف تعريف لعبة حيث يتم تعيين بعض الحقول بشكل صريح بينما تعتمد الحقول الأخرى على قيمها الافتراضية الصفرية.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • player.go: قم بتعريف هيكل Player مع الحقول التالية: Username (string)، و Level (int)، و Score (int)، و IsPremium (bool)، و GuildName (string). قم أيضاً بإنشاء تابع DisplayProfile يعيد سلسلة نصية منسقة تعرض جميع معلومات اللاعب.
  • main.go: اقرأ اسم المستخدم من المدخلات وقم بإنشاء Player باستخدام تهيئة جزئية فقط—قم بتعيين حقل Username فقط. ثم اعرض ملف التعريف الكامل لترى كيف تملأ Go الحقول غير المعينة بقيمها الصفرية.

سيتم توفير المدخلات التالية:

  • السطر 1: اسم مستخدم اللاعب

يجب أن يعيد تابع DisplayProfile الخاص بك سلسلة نصية بهذا التنسيق تماماً:

Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]

على سبيل المثال، إذا كان اسم المستخدم هو ShadowKnight، يجب أن يظهر مخرجك اسم المستخدم جنباً إلى جنب مع جميع القيم الصفرية للحقول غير المهيأة:

Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: 

لاحظ كيف لا يظهر حقل Guild أي شيء بعد النقطتين الرأسيتين—هذه هي القيمة الصفرية للسلسلة النصية الفارغة. يساعدك هذا التحدي على رؤية ما تخصصه Go بالضبط لكل نوع عندما لا تقدم قيمة صريحة.

ورقة مرجعية

في لغة Go، لكل متغير قيمة صفرية (zero value) — وهي القيمة الافتراضية التي يتم تعيينها عند التصريح عن متغير دون تهيئة صريحة.

لكل نوع قيمته الصفرية الخاصة:

النوعالقيمة الصفرية
int, float640
string"" (سلسلة نصية فارغة)
boolfalse
pointer, slice, mapnil

عند إنشاء struct، فإن أي حقل لا تقوم بتعيينه بشكل صريح يأخذ قيمته الصفرية:

type User struct {
    Name   string
    Age    int
    Active bool
}

func main() {
    var u User
    fmt.Println(u.Name)   // "" (سلسلة نصية فارغة)
    fmt.Println(u.Age)    // 0
    fmt.Println(u.Active) // false
}

التهيئة الجزئية — الحقول المحددة فقط هي التي تحصل على قيم مخصصة:

u := User{Name: "Alice"}
fmt.Println(u.Age)    // 0
fmt.Println(u.Active) // false

تجعل القيم الصفرية الـ structs قابلة للاستخدام فوراً دون تهيئة صريحة. كن حذراً مع الأنواع المرجعية (reference types) مثل slices و maps — قيمتها الصفرية هي nil، مما قد يتسبب في حدوث runtime panics إذا تم استخدامها دون تهيئة.

جرّب بنفسك

package main

import (
	"fmt"
)

func main() {
	// قراءة اسم المستخدم من المدخلات
	var username string
	fmt.Scanln(&username)

	// TODO: إنشاء Player باستخدام تهيئة جزئية
	// قم بتعيين حقل Username فقط، واترك الحقول الأخرى تستخدم القيم الصفرية

	// TODO: عرض ملف تعريف اللاعب باستخدام طريقة DisplayProfile
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming