Go, main()'den önce başlatma kodunu yürütmek için init işlevini destekler. Go programı başlatıldığında, derleyici her pakette tanımlanan tüm init işlevlerini, paket değişkenlerinin başlangıcından sonra otomatik olarak çağırır.
Soru tarihi: Paketin kullanımından önce durumunu bir kez hazırlama gerekliliği.
Problem: init'in başlangıç sırası sıklıkla örtük hatalara neden olur: belirli bir init işlevinin ne zaman çalıştığını kontrol etmek zordur, özellikle paketler arasında birçok bağımlılık olduğunda.
Çözüm:
Kod örneği:
package example import "fmt" var Cfg string = "default" func init() { fmt.Println("örnek init") Cfg = "konfigüre edildi" }
Anahtar özellikler:
Aynı dosyada birden fazla init işlevi tanımlanabilir mi?
Evet, birden fazla init işlevine izin verilir - bunlar ilan sırasına göre çağrılacaktır.
Bir paket yalnızca dolaylı olarak (üzerinden _ "package") ithal edilirse ne olur?
Bu paketin yalnızca init işlevleri ve değişkenlerinin başlangıcı gerçekleştirilecektir.
Init işlevleri değer veya hata döndürebilir mi?
Hayır. init'in imzası sabittir: func init(), parametresiz ve dönüş değerleri olmadan.
Büyük bir proje karmaşık init işlevlerine dayanarak, paketler arasında bağımlılıklarla küresel durumları başlatıyordu. Bu, çalıştırmada dalgalı hatalara neden oluyordu.
Artıları:
Eksileri:
Init yalnızca temel veya test-spesifik görevler için kullanılıyor, geri kalanı main()'den çağrılan açık işlevlere ayrılmıştır. Başlatma sırası belirgindir, test etmesi kolaydır.
Artıları:
Eksileri: