בדיקות טיפוס
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 17 מתוך 68.
כשעובדים עם משתני ממשק, לעיתים קרובות צריך לגשת לערך הממשי הקונקרטי המאוחסן בהם. כאן נכנסות לתמונה המרות טיפוסים (type assertions) — הן מאפשרות לחלץ בבטחה את הערך הבסיסי ולהשתמש בו.
הצהרת טיפוס משתמשת בתחביר הזה: value, ok := interfaceVariable.(Type). ערך ההחזרה הראשון הוא הערך שחולץ מהטיפוס שצוין, והשני הוא ערך בוליאני שמציין אם ההצהרה הצליחה.
var data interface{} = 42
number, ok := data.(int)
if ok {
fmt.Println("It's an integer:", number)
} else {
fmt.Println("Not an integer")
}המשתנה ok חיוני לבטיחות. אם תנסה לבצע המרת טיפוס שגויה, ok יהיה false, ו-value יהיה ערך האפס של אותו טיפוס. בלי לבדוק את ok, המרת טיפוס שנכשלה תגרום לתוכנית שלך להיכנס למצב panic.
המרות טיפוס הן חיוניות בעבודה עם ערכי interface{}, ומאפשרות לך להמיר את הממשק הכללי בחזרה לטיפוס מסוים כדי שתוכל להשתמש בשיטות ובפעולות שלו.
אתגר
קלבאתגר הזה תתרגל שימוש בהצהרות טיפוס כדי לחלץ בבטחה ערכים קונקרטיים ממשתני ממשק ולעבוד איתם. תיצור מנתח נתונים שמעבד סוגים שונים של ערכים המאוחסנים בממשקים ריקים.
תקבל שתי קלטים:
- מחרוזת שמייצגת את סוג הנתונים שיש לבדוק (למשל,
"int","string"או"bool") - מחרוזת שמייצגת את הערך בפועל (למשל,
"42","hello"או"true")
המשימה שלך היא:
- להמיר את מחרוזת הערך לסוג Go המתאים ולאחסן אותה במשתנה
interface{}:- עבור
"int": להמיר למספר שלם - עבור
"string": להשתמש בה כמחרוזת - עבור
"bool": להמיר לערך בוליאני
- עבור
- להשתמש בהצהרת טיפוס כדי לבדוק אם משתנה הממשק מכיל את הסוג הצפוי שצוין בקלט הראשון
- אם הצהרת הטיפוס מצליחה, להדפיס:
"Success: [value] is a [type]" - אם הצהרת הטיפוס נכשלת, להדפיס:
"Failed: value is not a [type]"
עליך להשתמש בתחביר הבטוח של הצהרת טיפוס עם המשתנה ok כדי לבדוק אם ההצהרה הצליחה. האתגר בודק את ההבנה שלך כיצד לחלץ בבטחה ערכים קונקרטיים ממשתני ממשק, בלי לגרום לתוכנית שלך להיכנס למצב panic.
בהמרה לערך בוליאני, "true" צריך להפוך ל-true וכל מחרוזת אחרת צריכה להפוך ל-false. השתמש בחבילה strconv כדי להמיר מחרוזת למספר שלם.
נסו בעצמכם
package main
import (
"fmt"
"strconv"
)
func main() {
// קראו את הקלט
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// משתנה לאחסון ערך הממשק
var interfaceValue interface{}
// TODO: כתבו את הקוד שלכם למטה
// 1. המירו את valueStr לטיפוס המתאים לפי dataType ואחסנו אותו ב-interfaceValue
// 2. השתמשו בבדיקת טיפוס כדי לבדוק אם interfaceValue מכיל את הטיפוס הצפוי
// 3. הדפיסו את הודעת ההצלחה או הכישלון המתאימה
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאי3ממשקים (הבסיס)
מהו ממשק?הגדרת ממשקמימוש ממשקשימוש בטיפוסי ממשקממשק ריקבדיקות טיפוסמתג טיפוסיםסיכום – צורות והתנהגויותתרגלו בעצמכם: קומפיילר Go אונליין