Go uygulaması başlatıldığında, tüm non-test paketleri belirli bir sırayla başlatılır: önce tüm içe aktarılan bağımlılıklar (zincir üzerinden), sonra doğrudan paket. Başlatma için kullanılır:
Init fonksiyonları, paket değişkenlerinin başlatılmasından sonra çağrılır. Eğer bir paket içe aktarılıyorsa, onun init fonksiyonu değişkenlerin/fonksiyonların kullanımından önce bir kez yürütülür.
Örnek:
var a = getA() func getA() int { fmt.Println("getA çağrıldı") return 42 } func init() { fmt.Println("init çağrıldı") } // Çıktı: // getA çağrıldı // init çağrıldı
Özellikler:
Herhangi bir paketini init fonksiyonunu doğrudan çağırmak mümkün mü?
Cevap: Hayır, init fonksiyonu program kodundan doğrudan çağrılmaz. Paket başlatma süreci sırasında runtime tarafından belirli bir anda çağrılır, init() çağrısının doğrudan yapılması — derleme hatasına yol açar.
Hikaye
Projede iki paket birbirlerini içe aktararak global değişkenleri init() ile başlattılar. Bu, döngüsel bağımlılıklarla ve derleme hatalarıyla sonuçlandı — Go doğru başlatma sırasını belirleyemedi.
Hikaye
Karmaşık bir hatanın sebebi, init fonksiyonlarının henüz başlatılmamış paket değişkenlerini kullanmasıydı. Sonuç: belirsiz davranış ve öngörülemeyen durumlarla başlatma sırasında.
Hikaye
Projede yan etkiler için paketsiz içe aktarmalar yapıldı (import _ "some/lib"). Kodun yeniden düzenlenmesinden sonra, gerekli paketin init fonksiyonu çok erken çağrıldı (diğer paketteki bağımlı değişkenlerin başlatılmasından önce), debug edilmesi zor bir hata ortaya çıktı.