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},
}מכיוון שלמבנים אנונימיים אין שם טיפוס, אי אפשר להגדיר להם מתודות או לעשות שימוש חוזר בטיפוס במקום אחר. השתמש בהם לקיבוץ זמני ומקומי של נתונים. לכל דבר שתפנה אליו כמה פעמים, הגדר במקום זאת טיפוס מבנה בעל שם.
אתגר
קלבואו נבנה מערכת תצורה פשוטה שמדגימה מתי מבנים אנונימיים מועילים — לקיבוץ נתונים חד־פעמי שאינו זקוק לטיפוס שניתן לשימוש חוזר.
תארגנו את הקוד שלכם בשני קבצים:
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]
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP ב-Go
קבצים חיצונייםסביבת העבודה והמודולים של Goחבילות וייבואשמות מיוצאים לעומת שמות לא מיוצאיםמבוא ל-OOP ב-GoStructs כמחלקותהגדרת מתודות עבור Structsמקבלי Pointer לעומת Valueאתחול Structפונקציות Constructorחזרה – מחשבון פשוט4ממשקים
מבוא לממשקיםמימוש משתמעממשק כחוזהממשק ריק (any)אימות טיפוסמתג טיפוסיםהרכבת ממשקיםממשקי Stringer ו-Errorסיכום – מחשבון צורות7כימוס
שדות מיוצאים לעומת שדות לא מיוצאיםכימוס ברמת החבילהמתודות Getter ו-Setterהסתרת מידע ב-Goסיכום – רשומות תלמידים10Generics (Go 1.18 ומעלה)
מבוא ל־Genericsפרמטרים של טיפוסיםאילוצי טיפוסיםמבנים גנרייםפתרון עוקף למתודות גנריותסיכום – אוסף גנרי2העמקה בסוגים וב-Structs
סוגים בסיסיים ומורכביםהגדרות של סוגים מותאמים אישיתתגיות StructStructs אנונימייםStructs מקונניםערכי אפס וברירות מחדלסיכום – ספר אנשי קשר5קומפוזיציה במקום ירושה
למה ב-Go אין ירושהיסודות הטמעת Structקידום מתודותהטמעת כמה Structsהטמעה לעומת אגרגציההסתרת מתודות מוטמעותסיכום – היררכיית עובדים8טיפול בשגיאות ו-OOP
ממשק errorסוגי שגיאות מותאמים אישיתעטיפת שגיאות (fmt.Errorf)שגיאות Sentinelerrors.Is() ו-errors.As()Panic, Defer ו-Recoverסיכום – מנתח קבצים11ספרייה סטנדרטית ותכנות מונחה עצמים
io.Reader ו-io.Writersort.Interfaceהממשק fmt.Stringerencoding/json עם מבניםהממשק http.Handlerסיכום – מודלים של REST API3מצביעים וזיכרון
יסודות המצביעים ב-Goמצביעים למבניםהעברה לפי ערך לעומת לפי הפניההפונקציה new()איסוף אשפה ב-Goסיכום - בונה רשימה מקושרת6פולימורפיזם ב-Go
פולימורפיזם באמצעות ממשקיםטיפוס ברווז ב-Goכללי התאמה לממשקאוספים פולימורפייםהזרקת תלויותסיכום - מעבד תשלומים9מקביליות ו-OOP
יסודות GoroutinesChannels ותקשורתChannel עם חוצץ לעומת ללא חוצץפקודת Selectsync.Mutex ו-sync.RWMutexsync.WaitGroupתכנון Struct בטוח לשימוש במקבילסיכום - מאגר עובדים12מושגים מתקדמים בתכנות מונחה עצמים
דפוס האפשרויות הפונקציונליותדפוס Builder ב-Goשרשור מתודותכינויי טיפוסים לעומת הגדרותיסודות Reflectionסקירה כללית של יצירת קודתרגלו בעצמכם: קומפיילר Go אונליין