دروس الوحدة (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 | كافة الحقول بقيمتها الصفرية |
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).
i := 42
var f float64 = float64(i)
var u uint = uint(i)وينطبق هذا حتى على الأنواع "المتوافقة" مثل int وint64:
التحويل الصريح مطلوب دائمًا.
var a int = 10
var b int64 = int64(a) // obbligatorioالتحويل بين الأرقام: احذر من الاقتطاع
الانتقال من float64 إلى int يقتطع باتجاه الصفر، لا يحدث ذلك
جولة:
f := 3.9
i := int(f) // 3, non 4
n := int(-3.9) // -3, non -4سلسلة ↔ تحويل الأرقام
string(65) لا يعطي "65": إنه يعطي "A" (الرون مع الكود
النقطة 65). بالنسبة للسلسلة → الرقم والعكس، تحتاج إلى strconv
الحزمة:
import "strconv"
s := strconv.Itoa(42) // "42"
n, err := strconv.Atoi("42") // 42, nilسنقوم بتغطيتها بعمق في وحدة Stdlib.
دورك
قم بتعريف عداد متغير من النوع int دون تهيئته وطباعته. المتوقع: 0.
إظهار التلميح
بدون مُهيئ، يأخذ المتغير القيمة الصفرية للنوع.
الحل متاح بعد 3 من المحاولات
بالنظر إلى العدد الصحيح n=10، قم بتحويل n إلى float64 واقسمه على 4. اطبع النتيجة (المتوقع 2.5).
إظهار التلميح
بدون التحويل الصريح، `n / 4` هو قسمة عدد صحيح يعطي 2.
الحل متاح بعد 3 من المحاولات
ماذا يطبع هذا الكود؟
f := 3.7
fmt.Println(int(f))خلاصة
- كل نوع له قيمة صفر ثابتة: لا يوجد
undefined، ولا يوجد UB. - الشريحة/الخريطة/تشان/func/interface/المؤشر لها قيمة صفر
nil. - التحويلات الرقمية تكون صريحة دائمًا مع
type(value). int(float)يقتطع باتجاه الصفر؛ لتقريب الاستخدامmath.Round.- بالنسبة لرقم السلسلة ↔، استخدم الحزمة
strconv(وليس الإرسال المباشر).