דילוג לתוכן המרכזי
מודול 1 · שיעור 2 מתוך 52/50 בקורס~10 min
שיעורי מודול (2/5)

המרות אפס ערך וסוג

ב-Go כל משתנה שהוכרז ללא ערך מפורש מקבל א ערך אפס: ה"ערך הנייטרלי" מסוגו. זה הבדל עצום מ-JavaScript, שבו let x; מייצר undefined, או C, איפה אתה מסיים עם זיכרון זבל. אין undefined, אין UB: רק אפס.

טבלת ערכי האפס

קטגוריההקלדערך אפס
מספריint, int64, float32, float64, uint, ...0
בוליאניתboolfalse
מחרוזתstring"" (מחרוזת ריקה)
מצביע*Tnil
פרוסה / מפה / ערוץ[]T, map[K]V, chan Tnil
פונקציה / ממשקfunc(...), interface{...}nil
מבנהT struct{...}כל השדות בערך האפס שלהם
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.
  • לפרוסה/מפה/chan/func/interface/pointer יש ערך אפס nil.
  • המרות מספריות תמיד מפורשות עם type(value).
  • int(float) קטוע לכיוון אפס; כדי לעגל השתמש ב-math.Round.
  • עבור מחרוזת מספר ↔ השתמש בחבילה strconv (לא ליהוק ישיר).