הפונקציה new()
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 22 מתוך 107.
Go מספקת פונקציה מובנית בשם new() שמקצה זיכרון עבור טיפוס ומחזירה מצביע אליו. הזיכרון שהוקצה מאותחל לערך האפס של הטיפוס.
p := new(int) // מקצה זיכרון עבור int
fmt.Println(*p) // 0 (ערך אפס)
fmt.Println(p) // 0xc000018030 (כתובת זיכרון)הפונקציה new() מקבלת טיפוס כארגומנט ומחזירה מצביע לערך אפס שהוקצה לאחרונה מטיפוס זה. הדבר שימושי במיוחד כשצריך מצביע, אבל אין משתנה קיים שאליו אפשר להפנות.
עם מבנים, new() יוצרת מצביע למבנה שכל השדות בו מוגדרים לערכי האפס שלהם.
type Person struct {
Name string
Age int
}
p := new(Person)
fmt.Println(p.Name) // "" (מחרוזת ריקה)
fmt.Println(p.Age) // 0ייתכן שתהה מתי להשתמש ב־new() לעומת אופרטור הכתובת &. שתי הגישות שלהלן שקולות:
// שימוש ב-new()
p1 := new(Person)
// שימוש באופרטור הכתובת עם ליטרל
p2 := &Person{}תחביר &Person{} נפוץ יותר בפועל כי הוא מאפשר לך לאתחל שדות בו-זמנית. השתמש ב-new() כשאתה רוצה במפורש מופע עם ערכי אפס ומעדיף סמנטיקה מפורשת של הקצאת זיכרון.
אתגר
קלבואו נבנה מנהל תצורה שמדגים כיצד new() מקצה זיכרון ומאתחל מבנים לערכי האפס שלהם. תראו במה הגישה הזאת שונה משימוש באופרטור הכתובת עם מילולית של מבנה.
תארגנו את הקוד שלכם בשני קבצים:
config.go: הגדירו מבנהServerConfigעם השדותHost(string),Port(int),MaxConnections(int) ו-DebugMode(bool). צרו שתי פונקציות:NewServerConfigשמשתמשת ב-new()כדי להקצותServerConfigומחזירה ישירות את המצביע (עם כל ערכי האפס)ConfigureServerשמקבלת מצביע*ServerConfigיחד עם מחרוזת של שם מארח ומספר שלם של יציאה, ואז מגדירה את השדות האלה בתצורה דרך המצביע
Displayעל*ServerConfigשמחזירה מחרוזת מעוצבת המציגה את כל ערכי התצורה.main.go: קראו שם מארח ויציאה מהקלט. תחילה, צרו תצורה באמצעותNewServerConfig()והציגו אותה כדי להראות את ערכי האפס. לאחר מכן השתמשו ב-ConfigureServerכדי להגדיר את שם המארח והיציאה, והציגו שוב את התצורה כדי להראות את הערכים המעודכנים.
הקלטים הבאים יסופקו:
- שורה 1: שם מארח (string)
- שורה 2: מספר יציאה (integer)
המתודה Display שלכם צריכה להחזיר מחרוזת בפורמט המדויק הבא:
Host: [Host]
Port: [Port]
MaxConnections: [MaxConnections]
DebugMode: [DebugMode]הדפיסו את פלט התצוגה פעמיים: פעם אחת לפני הגדרת התצורה (כדי להציג את ערכי האפס) ופעם אחת לאחר הגדרת התצורה (כדי להציג את שם המארח והיציאה המעודכנים).
לדוגמה, עבור localhost ו-8080, הפלט שלכם צריך להיות:
Host:
Port: 0
MaxConnections: 0
DebugMode: false
Host: localhost
Port: 8080
MaxConnections: 0
DebugMode: falseשימו לב שהתצוגה הראשונה מציגה את כל ערכי האפס (מחרוזת ריקה, 0, 0, false), משום ש-new() מאתחלת הכול לערכי אפס. לאחר הקריאה ל-ConfigureServer, רק שם המארח והיציאה משתנים, בעוד ששאר השדות נותרים עם ערכי האפס שלהם.
נסו בעצמכם
package main
import (
"fmt"
)
func main() {
// קרא את הקלט
var host string
var port int
fmt.Scanln(&host)
fmt.Scanln(&port)
// TODO: צור תצורה באמצעות NewServerConfig() והצג אותה
// כך יוצגו ערכי האפס
// TODO: השתמש ב-ConfigureServer כדי להגדיר את host ואת port
// TODO: הצג שוב את התצורה כדי להראות את הערכים המעודכנים
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין