Menu
Coddy logo textTech

Structs אנונימיים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 15 מתוך 107.

מבנה אנונימי הוא מבנה ללא טיפוס בעל שם. מגדירים את המבנה שלו ויוצרים מופע בצעד אחד, בלי להשתמש במילת המפתח type.

person := struct {
    Name string
    Age  int
}{
    Name: "Alice",
    Age:  30,
}

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

מקרה שימוש נפוץ הוא קיבוץ נתונים קשורים עבור פונקציה או בדיקה יחידה.

config := struct {
    Host string
    Port int
}{
    Host: "localhost",
    Port: 8080,
}
fmt.Println(config.Host) // localhost

מבנים אנונימיים פופולריים גם בבדיקות מונחות־טבלה, שבהן לכל מקרה בדיקה יש שדות ייחודיים.

tests := []struct {
    input    int
    expected int
}{
    {1, 2},
    {5, 10},
}

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

challenge icon

אתגר

קל

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

תארגנו את הקוד שלכם בשני קבצים:

  • config.go: צרו פונקציה בשם GetServerConfig שמקבלת את שם השרת (מחרוזת), את היציאה (מספר שלם) ואת מצב ניפוי השגיאות (בוליאני) כפרמטרים. הפונקציה צריכה להחזיר מבנה אנונימי שמכיל את שלושת הערכים האלה כשדות: Name, Port ו-Debug. מכיוון שמשתמשים בתצורה הזאת רק במקום אחד, אין צורך להגדיר עבורה טיפוס בעל שם.
  • main.go: קראו את ערכי תצורת השרת מהקלט, קראו לפונקציה GetServerConfig שלכם והציגו את פרטי התצורה.

הקלט הבא יסופק:

  • שורה 1: שם השרת
  • שורה 2: מספר היציאה
  • שורה 3: מצב ניפוי השגיאות (true או false)

תבנית הפלט:

Server: [Name]
Port: [Port]
Debug: [Debug]

לדוגמה, עבור api-server, 8080 ו-true, הפלט שלכם צריך להיות:

Server: api-server
Port: 8080
Debug: true

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

נסו בעצמכם

package main

import (
	"fmt"
)

func main() {
	// קרא את ערכי הקלט
	var name string
	var port int
	var debug bool

	fmt.Scanln(&name)
	fmt.Scanln(&port)
	fmt.Scanln(&debug)

	// TODO: קרא ל-GetServerConfig עם ערכי הקלט
	// ושמור את ה-struct האנונימי שהוחזר

	// TODO: הדפס את התצורה בפורמט הנדרש:
	// Server: [Name]
	// Port: [Port]
	// Debug: [Debug]
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה תכנות מונחה עצמים

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