Go ondersteunt de init-functie om initialisatiecode uit te voeren voordat main() wordt uitgevoerd. Bij het starten van een Go-programma roept de compiler automatisch alle init-functies aan die in elk pakket zijn gedefinieerd, na de initialisatie van de pakketsvariabelen.
Achtergrond van de vraag: de noodzaak om de toestand van een pakket één keer voor gebruik voor te bereiden.
Probleem: de volgorde van initialisatie van init wordt vaak de oorzaak van onopgemerkte fouten: het is moeilijk te beheersen wanneer precies een specifieke init-functie wordt uitgevoerd, vooral bij meerdere afhankelijkheden tussen pakketten.
Oplossing:
Codevoorbeeld:
package example import "fmt" var Cfg string = "default" func init() { fmt.Println("example init") Cfg = "configured" }
Belangrijkste kenmerken:
Kun je meer dan één init-functie in één bestand definiëren?
Ja, meerdere init-functies zijn toegestaan — zij worden in volgorde van declaratie aangeroepen.
Wat gebeurt er als een pakket alleen indirect wordt geïmporteerd (via _ "package")?
Alleen de init-functies en de initialisatie van de variabelen van dat pakket worden uitgevoerd.
Kunnen init-functies een waarde of fout retourneren?
Nee. De handtekening van init is onveranderlijk: func init(), zonder parameters en retourwaarden.
Een groot project vertrouwde op complexe init-functies die globale toestanden initialiseren met afhankelijkheden tussen pakketten. Dit veroorzaakte onvoorspelbare opstartfouten.
Voordelen:
Nadelen:
Init wordt alleen gebruikt voor basis- of test-specifieke taken, de rest is ondergebracht in expliciete functies die vanuit main() worden aangeroepen. De volgorde van uitvoering is duidelijk, evenals de eenvoud van testen.
Voordelen:
Nadelen: