Menu
Coddy logo textTech

הפונקציה 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() כשאתה רוצה במפורש מופע עם ערכי אפס ומעדיף סמנטיקה מפורשת של הקצאת זיכרון.

challenge icon

אתגר

קל

בואו נבנה מנהל תצורה שמדגים כיצד 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: הצג שוב את התצורה כדי להראות את הערכים המעודכנים
}
quiz iconבחנו את עצמכם

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

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

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