Menu
Coddy logo textTech

ממשק ריק

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-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{}.

challenge icon

אתגר

קל

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

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

  • מחרוזת שמייצגת את סוג הנתונים (למשל, "int", "string", "bool" או "slice")
  • מחרוזת שמייצגת את הערך עצמו (למשל, "42", "hello", "true" או "1,2,3")

המשימה שלכם היא:

  1. ליצור פונקציה בשם processData שמקבלת פרמטר מסוג interface{} ומדפיסה מידע על הערך
  2. בהתאם לקלט של סוג הנתונים, להמיר את מחרוזת הערך לסוג Go המתאים:
    • עבור "int": להמיר למספר שלם
    • עבור "string": להשתמש בו כמחרוזת
    • עבור "bool": להמיר לערך בוליאני
    • עבור "slice": להמיר ערכים המופרדים בפסיקים לפרוסה של מספרים שלמים
  3. לקרוא לפונקציה processData עם הערך שהומר
  4. בתוך 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 עם הערך שהומר
	
}
quiz iconבחנו את עצמכם

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

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

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