متى وبأي ترتيب يتم تنفيذ الدالة 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`؟