ממשק ריק
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 16 מתוך 68.
עד עכשיו עבדת עם ממשקים שדורשים שיטות מסוימות, אבל ל-Go יש ממשק מיוחד וגמיש להפליא: הממשק הריק, שנכתב כך: interface{}.
לממשק הריק אין דרישות לגבי מתודות כלל, ולכן כל טיפוס ב-Go מקיים אותו באופן אוטומטי. מכיוון שכל טיפוס מממש אפס מתודות (לכל הפחות), אפשר לשייך כל טיפוס למשתנה מסוג interface{}:
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // sliceהדבר הופך את interface{} לשימושי ביותר כשצריך לעבוד עם נתונים מסוג לא ידוע או מסוגים משתנים. ייתכן שתיתקל בכך בעת קריאת קובצי תצורה, טיפול בקלט מהמשתמש או עבודה עם ממשקי API שמחזירים סוגי נתונים שונים בהתאם למצב.
עם זאת, מכיוון שהממשק הריק יכול להכיל כל סוג, לעיתים קרובות תצטרך לקבוע איזה סוג באמת מאוחסן בתוכו לפני שתוכל להשתמש בערך באופן משמעותי. כאן טענות טיפוס ומתגי טיפוסים (שעליהם תלמד בהמשך) נעשים כלים חיוניים לעבודה בטוחה עם ערכי interface{}.
אתגר
קלבאתגר הזה תתרגלו עבודה עם הממשק הריק באמצעות יצירת מעבד נתונים שיכול לטפל בערכים מסוגים שונים. תיצרו פונקציה שמקבלת פרמטר מסוג interface{} ומעבדת סוגי נתונים שונים.
תקבלו שתי קלטים:
- מחרוזת שמייצגת את סוג הנתונים (למשל,
"int","string","bool"או"slice") - מחרוזת שמייצגת את הערך עצמו (למשל,
"42","hello","true"או"1,2,3")
המשימה שלכם היא:
- ליצור פונקציה בשם
processDataשמקבלת פרמטר מסוגinterface{}ומדפיסה מידע על הערך - בהתאם לקלט של סוג הנתונים, להמיר את מחרוזת הערך לסוג Go המתאים:
- עבור
"int": להמיר למספר שלם - עבור
"string": להשתמש בו כמחרוזת - עבור
"bool": להמיר לערך בוליאני - עבור
"slice": להמיר ערכים המופרדים בפסיקים לפרוסה של מספרים שלמים
- עבור
- לקרוא לפונקציה
processDataעם הערך שהומר - בתוך
processData, להדפיס את הערך ואת הסוג שלו בפורמט:"Value: [value], Type: [type]"
עבור קלט מסוג פרוסה, יש להמיר את המחרוזת המופרדת בפסיקים כמו "1,2,3" ל-[]int{1, 2, 3}. הפונקציה אמורה לעבוד עם כל סוג, מכיוון שהיא מקבלת interface{}, ולהדגים כיצד הממשק הריק יכול להכיל ערכים מכל סוג. השתמשו ב-fmt.Printf עם פקודות העיצוב %v ו-%T כדי להציג את הערך ואת הסוג, בהתאמה.
נסו בעצמכם
package main
import (
"fmt"
)
func main() {
// קראו את הקלט
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// TODO: כתבו את הקוד שלכם למטה
// 1. צרו את הפונקציה processData שמקבלת interface{}
// 2. המירו את valueStr לטיפוס המתאים על סמך dataType
// 3. קראו ל-processData עם הערך שהומר
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין