Menu
Coddy logo textTech

מתג טיפוסים

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 18 מתוך 68.

אף שהצהרות טיפוס מתאימות לבדיקת טיפוס יחיד, לעיתים קרובות צריך לטפל בכמה טיפוסים אפשריים של משתנה ממשק. כאן מתג טיפוסים נעשה שימושי במיוחד — הוא מספק דרך ברורה לבצע פעולות שונות בהתאם לטיפוס הקונקרטי.

מתג טיפוסים משתמש בתחביר המיוחד הזה: switch v := i.(type). שימו לב למילת המפתח (type) במקום לטיפוס מסוים. המשתנה v יכיל בכל מקרה את הערך בפועל עם הטיפוס הקונקרטי שלו:

func describe(data interface{}) {
    switch v := data.(type) {
    case int:
        fmt.Printf("Integer: %d\n", v)
    case string:
        fmt.Printf("String: %s\n", v)
    case bool:
        fmt.Printf("Boolean: %t\n", v)
    default:
        fmt.Printf("Unknown type: %T\n", v)
    }
}

בכל אחד מהמקרים, ל־v יש באופן אוטומטי את הטיפוס הנכון — אין צורך בהצהרת טיפוס נוספת. כך מתגי טיפוסים נעשים נקיים בהרבה משרשור של כמה הצהרות טיפוס עם משפטי if-else, במיוחד כשצריך לטפל בכמה טיפוסים שונים במקום אחד.

challenge icon

אתגר

קל

באתגר הזה תתרגלו שימוש במתגי טיפוסים כדי לטפל בכמה סוגי נתונים במערכת התראות. תיצרו פונקציה שמעבדת סוגים שונים של התראות ומעצבת אותם בהתאם לטיפוס הקונקרטי שלהם.

תקבלו שתי קלטים:

  • מחרוזת שמייצגת את סוג ההתראה (למשל, "email", "sms", "push" או "alert")
  • מחרוזת שמייצגת את תוכן ההתראה או את הערך שלה

עליכם:

  1. ליצור פונקציה בשם processNotification שמקבלת פרמטר מסוג interface{}
  2. בהתאם לקלט של סוג ההתראה, להמיר את התוכן לטיפוס Go המתאים ולאחסן אותו במשתנה מסוג interface{}:
    • עבור "email": להשתמש בתוכן כמחרוזת
    • עבור "sms": להמיר את התוכן למספר שלם (שמייצג את מספר התווים)
    • עבור "push": להמיר את התוכן לערך בוליאני (true עבור "enabled", ו-false עבור כל ערך אחר)
    • עבור "alert": להמיר את התוכן לערך מסוג float64 (שמייצג את רמת העדיפות)
  3. לקרוא לפונקציה processNotification עם הערך שהומר
  4. בתוך processNotification, להשתמש במתג טיפוסים כדי לטפל בכל טיפוס ולהדפיס את ההודעה המתאימה:
    • עבור string: "Email notification: [value]"
    • עבור int: "SMS notification with [value] characters"
    • עבור bool: "Push notifications: [value]"
    • עבור float64: "Alert with priority: [value]"
    • עבור כל טיפוס אחר: "Unknown notification type"

השתמשו בחבילה strconv להמרת מחרוזות. בהמרה לערך בוליאני, רק "enabled" אמור להניב true. האתגר הזה מדגים איך מתגי טיפוסים מאפשרים לטפל בכמה טיפוסים בצורה ברורה בתוך מבנה בקרה יחיד, ומספקים לכם באופן אוטומטי את הערך בעל הטיפוס הנכון בכל מקרה.

הדפיסו את float64 בצורתו הקצרה ביותר, כפי שעושים fmt.Println או פעלי הפורמט %v / %g: הערך 3.5 יודפס בתור 3.5, והערך 1.0 בתור 1 (הפועל %f היה מדפיס 1.000000).

נסו בעצמכם

package main

import (
	"fmt"
	"strconv"
)

func main() {
	// קראו את הקלט
	var notificationType string
	var content string
	fmt.Scanln(&notificationType)
	fmt.Scanln(&content)
	
	// TODO: כתבו את הקוד שלכם למטה
	// 1. צרו פונקציה בשם processNotification שמקבלת פרמטר מסוג interface{}
	// 2. המירו את content לסוג המתאים לפי notificationType
	// 3. קראו ל-processNotification עם הערך המומר
	// 4. השתמשו ב-type switch בתוך processNotification כדי לטפל בסוגים שונים
	
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

תרגלו בעצמכם: קומפיילר Go אונליין