Menu
Coddy logo textTech

הפונקציה `init`

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 56 מתוך 68.

הפונקציה init היא פונקציה מיוחדת ב-Go שרצה אוטומטית כשמייבאים חבילה. בניגוד לפונקציות רגילות, לא קוראים ישירות ל-init — Go מפעילה אותה עבורך במהלך תהליך האתחול של החבילה.

כך מגדירים פונקציית init:

package mypackage

import "fmt"

func init() {
    fmt.Println("Package mypackage is being initialized!")
}

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

כשמייבאים חבילה שמכילה פונקציית init, אפשר לראות את ההשפעות שלה מיד, גם אם לא משתמשים באף אחת מהפונקציות המיוצאות של החבילה. לכן דפוס הייבוא עם המזהה הריק שלמדת קודם שימושי כל כך — הוא מאפשר להפעיל אתחול של חבילה בלי להשתמש ישירות בקוד שלה.

challenge icon

אתגר

קל

צרו מערכת לאתחול חבילות שמדגימה כיצד פונקציות init מופעלות אוטומטית כשמייבאים חבילות. תבנו מערכת רישום שבה חבילות שונות מאתחלות את עצמן ומתעדות את רצף ההפעלה שלהן.

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

  • מחרוזת שמכילה הגדרות חבילות בפורמט "package1:message1,package2:message2,package3:message3" (לדוגמה, "database:Database connection pool initialized,cache:Cache system ready,logger:Logging system started")
  • מחרוזת שמכילה את פעולות התוכנית הראשית בפורמט "operation1,operation2,operation3" (לדוגמה, "start_server,process_requests,shutdown")

עליכם:

  1. לנתח את הקלט הראשון באמצעות פיצול לפי פסיקים כדי לקבל את הגדרות החבילות הבודדות
  2. עבור כל הגדרת חבילה, לפצל לפי נקודתיים כדי לקבל את שם החבילה ואת הודעת האתחול
  3. ליצור מערך גלובלי בשם initLog למעקב אחר הודעות האתחול
  4. ליצור פונקציה בשם logInit שמקבלת שם חבילה והודעה, ואז מוסיפה למערך initLog את ההודעה המעוצבת "[INIT] [package_name]: [message]"
  5. לדמות אתחול חבילות באמצעות קריאה ל-logInit עבור כל חבילה, לפי סדר הופעתן בקלט
  6. להציג את הכותרת של רצף האתחול: "=== PACKAGE INITIALIZATION SEQUENCE ==="
  7. להדפיס כל הודעת אתחול מתוך המערך initLog
  8. להציג את הכותרת של התוכנית הראשית: "=== MAIN PROGRAM EXECUTION ==="
  9. להדפיס: "All packages initialized successfully"
  10. לנתח את הקלט השני באמצעות פיצול לפי פסיקים כדי לקבל את הפעולות הבודדות
  11. עבור כל פעולה בתוכנית הראשית:
    • להדפיס: "Executing: [operation]"
    • להוסיף הודעה ליומן: "[MAIN] Operation: [operation]"
  12. להציג את סיכום ההרצה:
    • "=== EXECUTION SUMMARY ==="
    • "Packages initialized: [number_of_packages]"
    • "Main operations executed: [number_of_operations]"
    • "Total log entries: [total_number_of_log_entries]"
  13. להציג את היומן המלא:
    • "=== COMPLETE EXECUTION LOG ==="
    • להדפיס כל רשומה מתוך היומן המלא (גם הודעות האתחול וגם פעולות התוכנית הראשית)
  14. להציג את ההודעה הסופית: "Program execution completed - all init functions ran before main"

השתמשו בחבילה strings כדי לפצל את מחרוזות הקלט, ובחבילה fmt להדפסה מעוצבת. האתגר הזה מדגים כיצד פונקציות init מופעלות אוטומטית במהלך ייבוא חבילה ותמיד רצות לפני הפונקציה main, ולכן הן מתאימות במיוחד להגדרה ולאתחול של חבילות.

נסו בעצמכם

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

// פרוסה גלובלית למעקב אחר הודעות אתחול
var initLog []string

func main() {
	reader := bufio.NewReader(os.Stdin)

	// קראו את הקלט (bufio מטפל כראוי בשורות עם רווחים)
	packageDefs, _ := reader.ReadString('\n')
	packageDefs = strings.TrimRight(packageDefs, "\r\n")

	mainOps, _ := reader.ReadString('\n')
	mainOps = strings.TrimRight(mainOps, "\r\n")

	// TODO: כתבו את הקוד שלכם למטה
	// 1. פצלו את packageDefs לפי "," כדי לקבל רשומות נפרדות של חבילות
	// 2. עבור כל רשומה, פצלו לפי ":" (לכל היותר ל־2 חלקים) כדי לקבל את packageName ואת message
	// 3. צרו פונקציה logInit(packageName, message string) שמוסיפה
	//    את "[INIT] [packageName]: message" לפרוסה הגלובלית initLog
	// 4. הציגו את כותרת רצף האתחול ואת כל רשומות יומן האתחול
	// 5. הציגו את כותרת הביצוע הראשי ועבדו כל פעולה מתוך mainOps
	//    - הדפיסו "Executing: <op>" עבור כל פעולה
	//    - הוסיפו את "[MAIN] Operation: <op>" ל־initLog
	// 6. הציגו סיכום ביצוע (מספר החבילות, מספר הפעולות, המספר הכולל של רשומות היומן)
	// 7. הצג את היומן המלא ואת הודעת הסיום הסופית

}
quiz iconבחנו את עצמכם

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

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

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