Go unterstützt die Funktion init zur Ausführung von Initialisierungscode vor dem Start von main(). Beim Starten des Go-Programms ruft der Compiler automatisch alle init-Funktionen auf, die in jedem Paket deklariert sind, nach der Initialisierung der Paketvariablen.
Geschichte der Frage: Notwendigkeit einmaliger Vorbereitung des Paketstatus vor dessen Verwendung.
Problem: Die Reihenfolge der Initialisierung von init wird oft zur Ursache für nicht offensichtliche Fehler: Es ist schwierig zu kontrollieren, wann genau eine bestimmte init-Funktion ausgeführt wird, besonders bei vielen Abhängigkeiten zwischen Paketen.
Lösung:
Beispielcode:
package example import "fmt" var Cfg string = "default" func init() { fmt.Println("example init") Cfg = "configured" }
Wesentliche Merkmale:
Kann man mehr als eine init-Funktion in einer Datei definieren?
Ja, mehrere init-Funktionen sind zulässig – sie werden in der Reihenfolge ihrer Deklaration aufgerufen.
Was passiert, wenn ein Paket nur indirekt (über _ "package") importiert wird?
Es werden nur die init-Funktionen und die Initialisierung der Variablen dieses Pakets ausgeführt.
Können init-Funktionen einen Wert oder einen Fehler zurückgeben?
Nein. Die Signatur von init ist unveränderlich: func init(), ohne Parameter und Rückgabewerte.
Ein großes Projekt verlässt sich auf komplexe init-Funktionen, die globale Zustände mit Abhängigkeiten zwischen Paketen initialisieren. Dies verursachte flüchtige Laufzeitfehler.
Vorteile:
Nachteile:
Init wird nur für grundlegende oder test-spezifische Aufgaben verwendet, alles andere wird in explizite Funktionen ausgelagert, die aus main() aufgerufen werden. Die Reihenfolge des Starts ist offensichtlich, die Einfachheit des Testens ist gegeben.
Vorteile:
Nachteile: