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

מתג אידיומטי

switch של Go יותר ארגונומי משל C/Java: לכל case יש את חסימה מרומזת משלו (אין break לכתיבה), אתה יכול לקבץ ערכים מרובים עם פסיק ו-switch ללא ביטוי מתנהגים כמו שרשרת if/else if קריאה יותר.

הפעל ערך

Go
giorno := "mar"
switch giorno {
case "lun", "mar", "mer", "gio", "ven":
    fmt.Println("feriale")
case "sab", "dom":
    fmt.Println("weekend")
default:
    fmt.Println("sconosciuto")
}

case מקבל מספר ערכים מופרדים בפסיקים ואין מרומז fallthrough: ברגע שמבוצע תיק, המתג יוצא.

מתג ללא תנאי

אם תשמיט את הביטוי, המתג יעריך את true וכל case הוא מצב bool. זוהי האלטרנטיבה האידיומטית לשרשראות if/else if ארוכות:

Go
switch {
case x < 0:
    fmt.Println("negativo")
case x == 0:
    fmt.Println("zero")
case x < 10:
    fmt.Println("piccolo")
default:
    fmt.Println("grande")
}

הצהרת Init

כמו ב-if, גם switch מקבל הצהרת init:

Go
switch n := len(s); {
case n == 0:
    fmt.Println("vuoto")
case n > 100:
    fmt.Println("lungo")
default:
    fmt.Println("ok")
}

n קיים רק בתוך המתג.

מפורש fallthrough

אם אתה באמת רוצה שההוצאה להורג תיפול בתיק הבא, עליך לכתוב את זה:

Go
switch 1 {
case 1:
    fmt.Println("uno")
    fallthrough
case 2:
    fmt.Println("due")  // anche questo viene stampato
case 3:
    fmt.Println("tre")  // questo no
}

מתג סוג (תצוגה מקדימה)

זה מאפשר לך להבחין על סמך הסוג הדינמי של ממשק ערך. נעסוק בזה לעומק במודול ממשקים:

Go
var i interface{} = "ciao"
switch v := i.(type) {
case int:
    fmt.Println("int:", v)
case string:
    fmt.Println("string:", v)
default:
    fmt.Printf("tipo %T\n", v)
}

נסה את זה

פעילות גופנית#go.m2.l4.e1
ניסיונות: 0טוען...

הדפס 'feriale' עבור lun/mar/mer/gio/ven, 'סוף שבוע' אחרת, באמצעות מתג על הערך של g.

טוען עורך...
הצג רמז

קבץ את 5 ימי השבוע לאותיות בודדות מופרדות בפסיקים.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m2.l4.e2
ניסיונות: 0טוען...

השתמש במתג ללא תנאי כדי להדפיס 'neg', '0' או 'pos' בהתאם ל-x.

טוען עורך...
הצג רמז

אין ביטוי אחרי `מתג`, רק `{`.

הפתרון זמין לאחר 3 ניסיונות

Quiz#go.m2.l4.e3
מוכן

מה התוכנית הזו מדפיסה?

Go
switch 1 {
case 1:
    fmt.Print("a")
case 2:
    fmt.Print("b")
}
אפשרויות תשובה

לְסַכֵּם

  • case מקבל מספר ערכים מופרדים בפסיקים.
  • ללא נפילה מרומזת: לכל מקרה יש break מרומז משלו.
  • switch { ... } ללא ביטוי = שרשרת if/else if קריאה יותר.
  • משפט Init: switch x := f(); { ... }, היקף מוגבל לבלוק.
  • fallthrough קיים אך נדיר; נכנס למקרה הבא מבלי להעריך את מצבו.
  • הקלד מתג v := i.(type) כדי להבחין על סמך הסוג הדינמי (מודול ממשקים).