מתג טיפוסים
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-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, במיוחד כשצריך לטפל בכמה טיפוסים שונים במקום אחד.
אתגר
קלבאתגר הזה תתרגלו שימוש במתגי טיפוסים כדי לטפל בכמה סוגי נתונים במערכת התראות. תיצרו פונקציה שמעבדת סוגים שונים של התראות ומעצבת אותם בהתאם לטיפוס הקונקרטי שלהם.
תקבלו שתי קלטים:
- מחרוזת שמייצגת את סוג ההתראה (למשל,
"email","sms","push"או"alert") - מחרוזת שמייצגת את תוכן ההתראה או את הערך שלה
עליכם:
- ליצור פונקציה בשם
processNotificationשמקבלת פרמטר מסוגinterface{} - בהתאם לקלט של סוג ההתראה, להמיר את התוכן לטיפוס Go המתאים ולאחסן אותו במשתנה מסוג
interface{}:- עבור
"email": להשתמש בתוכן כמחרוזת - עבור
"sms": להמיר את התוכן למספר שלם (שמייצג את מספר התווים) - עבור
"push": להמיר את התוכן לערך בוליאני (true עבור "enabled", ו-false עבור כל ערך אחר) - עבור
"alert": להמיר את התוכן לערך מסוג float64 (שמייצג את רמת העדיפות)
- עבור
- לקרוא לפונקציה
processNotificationעם הערך שהומר - בתוך
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(¬ificationType)
fmt.Scanln(&content)
// TODO: כתבו את הקוד שלכם למטה
// 1. צרו פונקציה בשם processNotification שמקבלת פרמטר מסוג interface{}
// 2. המירו את content לסוג המתאים לפי notificationType
// 3. קראו ל-processNotification עם הערך המומר
// 4. השתמשו ב-type switch בתוך processNotification כדי לטפל בסוגים שונים
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאי3ממשקים (הבסיס)
מהו ממשק?הגדרת ממשקמימוש ממשקשימוש בטיפוסי ממשקממשק ריקבדיקות טיפוסמתג טיפוסיםסיכום – צורות והתנהגויותתרגלו בעצמכם: קומפיילר Go אונליין