الانتقال إلى المحتوى الرئيسي
الوحدة 1 · الدرس 2 من 52/50 في الدورة~10 min
دروس الوحدة (2/5)

تحويلات القيمة والنوع صفر

في Go، يتلقى كل متغير تم الإعلان عنه بدون قيمة صريحة القيمة الصفرية: "القيمة المحايدة" لنوعها. إنه فرق كبير من JavaScript، حيث ينتج عن let x; undefined، أو C، حيث تنتهي مع الذاكرة القمامة. لا undefined، لا UB: صفر فقط.

جدول القيمة الصفرية

الفئةاكتبالقيمة صفر
رقميint, int64, float32, float64, uint, ...محمي_INLINE_15
منطقيةمحمي_INLINE_16محمي_INLINE_17
سلسلةمحمي_INLINE_18"" (سلسلة فارغة)
المؤشرمحمي_INLINE_20محمي_INLINE_21
شريحة / خريطة / قناةمحمي_INLINE_22, محمي_INLINE_23, محمي_INLINE_24محمي_INLINE_25
الوظيفة / الواجهةمحمي_INLINE_26, محمي_INLINE_27محمي_INLINE_28
هيكلمحمي_INLINE_29كافة الحقول بقيمتها الصفرية
Go
var i int        // 0
var f float64    // 0
var s string     // ""
var b bool       // false
var p *int       // nil
var nums []int   // nil  (NB: una slice nil ha len 0 e si può iterare!)

التحويلات صريحة دائمًا

على عكس C أو Python أو JS، لا يقوم Go ** بالترويج ** تلقائيًا ** لأحد هذه اللغات نوع رقمي إلى آخر: يجب عليك كتابة type(value).

Go
i := 42
var f float64 = float64(i)
var u uint = uint(i)

وينطبق هذا حتى على الأنواع "المتوافقة" مثل int وint64: التحويل الصريح مطلوب دائمًا.

Go
var a int = 10
var b int64 = int64(a)  // obbligatorio

التحويل بين الأرقام: احذر من الاقتطاع

الانتقال من float64 إلى int يقتطع باتجاه الصفر، لا يحدث ذلك جولة:

Go
f := 3.9
i := int(f)   // 3, non 4
n := int(-3.9) // -3, non -4

سلسلة ↔ تحويل الأرقام

string(65) لا يعطي "65": إنه يعطي "A" (الرون مع الكود النقطة 65). بالنسبة للسلسلة → الرقم والعكس، تحتاج إلى strconv الحزمة:

Go
import "strconv"

s := strconv.Itoa(42)        // "42"
n, err := strconv.Atoi("42") // 42, nil

سنقوم بتغطيتها بعمق في وحدة Stdlib.

دورك

تمرين#go.m1.l2.e1
المحاولات: 0جارٍ التحميل…

قم بتعريف عداد متغير من النوع int دون تهيئته وطباعته. المتوقع: 0.

جارٍ تحميل المحرر…
إظهار التلميح

بدون مُهيئ، يأخذ المتغير القيمة الصفرية للنوع.

الحل متاح بعد 3 من المحاولات

تمرين#go.m1.l2.e2
المحاولات: 0جارٍ التحميل…

بالنظر إلى العدد الصحيح n=10، قم بتحويل n إلى float64 واقسمه على 4. اطبع النتيجة (المتوقع 2.5).

جارٍ تحميل المحرر…
إظهار التلميح

بدون التحويل الصريح، `n / 4` هو قسمة عدد صحيح يعطي 2.

الحل متاح بعد 3 من المحاولات

Quiz#go.m1.l2.e3
جاهز

ماذا يطبع هذا الكود؟

Go
f := 3.7
fmt.Println(int(f))
خيارات الإجابة

خلاصة

  • كل نوع له قيمة صفر ثابتة: لا يوجد undefined، ولا يوجد UB.
  • الشريحة/الخريطة/تشان/func/interface/المؤشر لها قيمة صفر nil.
  • التحويلات الرقمية تكون صريحة دائمًا مع type(value).
  • int(float) يقتطع باتجاه الصفر؛ لتقريب الاستخدام math.Round.
  • بالنسبة لرقم السلسلة ↔، استخدم الحزمة strconv (وليس الإرسال المباشر).