Avatar ·

متى وبأي ترتيب يتم تنفيذ الدالة init() في Go؟

مرحبًا بالجميع! لقد بدأت للتو في تعلم Go وواجهت الدالة `init()`. في التوثيق مكتوب أنها تُنفذ تلقائيًا، لكنني لا أستطيع فهم: متى بالضبط؟ وماذا لو كان لدي عدة ملفات في الحزمة، كل منها يحتوي على `init()`؟ وماذا لو قمت باستيراد مكتبة خارجية تحتوي أيضًا على `init()`؟ هذا هو المثال الخاص بي. هناك حزمة `database` مع ملف `db.go`: ```go package database import "fmt" var Connection string func init() { fmt.Println("تهيئة قاعدة البيانات...") Connection = "postgres://user:pass@localhost/mydb" } ``` وملف `main.go`: ```go package main import ( "fmt" "myproject/database" ) func init() { fmt.Println("دالة init الخاصة بي في main") } func main() { fmt.Println(database.Connection) } ``` كنت أتوقع أن يتم تنفيذ `init` في database أولاً، ثم في main، ثم `main()`. ولكن هل هذا دائمًا صحيح؟ ماذا لو قمت باستيراد حزمة تستورد حزمة أخرى تحتوي على `init()`؟ هل الترتيب مضمون؟ وهل يمكن الاعتماد على `init`؟