560 Stimmen

Wann wird die init() Funktion ausgeführt?

Ich habe versucht, eine genaue Erklärung dafür zu finden, was die init()-Funktion in Go macht. Ich habe gelesen, was Effective Go sagt, war mir aber unsicher, ob ich es vollständig verstanden habe. Der genaue Satz, bei dem ich unsicher bin, lautet wie folgt:

Und schließlich bedeutet schließlich: init wird aufgerufen, nachdem alle Variablendeklarationen im Paket ihre Initialisierer evaluiert haben, und diese werden erst evaluiert, nachdem alle importierten Pakete initialisiert wurden.

Was bedeutet alle Variablendeklarationen im Paket haben ihre Initialisierer evaluiert? Bedeutet es, dass die `globalen` Variablen in einem Paket und seinen Dateien deklariert werden und init() nicht ausgeführt wird, bis alles evaluiert ist und dann werden alle init-Funktionen ausgeführt und dann main(), wenn ./main_dateiname ausgeführt wird?

Ich habe auch Mark Summerfields Go-Buch gelesen, und dort steht folgendes:

Wenn ein Paket eine oder mehrere init()-Funktionen hat, werden sie automatisch ausgeführt, bevor die main()-Funktion des Hauptpakets aufgerufen wird.

Nach meinem Verständnis ist init() nur relevant, wenn du main() ausführen möchtest, oder? Jeder, der init() genauer versteht, kann mich gerne korrigieren

7voto

kintsukuroi Punkte 1081

Ein paar weitere Tipps:

  • Es kann nur eine main() Funktion geben, aber es können viele init() Funktionen geben.
  • Sie müssen init() oder main() nicht explizit aufrufen, sie werden automatisch aufgerufen.
  • init() und main() akzeptieren keine Parameter und geben auch nichts zurück.
  • init() wird vor main() ausgeführt.
  • Wenn Sie viele init() haben, werden sie in der Reihenfolge ausgeführt, in der sie deklariert sind.

4voto

Toky Liu Punkte 41

Mehrere init Funktionen innerhalb eines Pakets ausführen Reihenfolge:

  1. const und Variablendefinitionen Datei init() Funktion ausführen

  2. Init-Funktionsausführungsreihenfolge nach Dateinamen aufsteigend

2voto

Schultz9999 Punkte 8211

https://golang.org/ref/mem#tmp_4

Die Programminitialisierung läuft in einem einzigen Goroutine ab, aber diese Goroutine kann andere Goroutinen erstellen, die parallel ablaufen.

Wenn ein Paket p ein Paket q importiert, erfolgt der Abschluss der Init-Funktionen von q bevor der Start von allen Funkionen von p stattfindet.

Der Start der Funktion main.main erfolgt nachdem alle Init-Funktionen abgeschlossen sind.

0voto

Xian Shu Punkte 632

init wird überall aufgerufen, wo sein Paket verwendet wird (unabhängig davon, ob ein leerer Import oder ein Import vorhanden ist), aber nur einmal.

das ist ein Paket:

package demo

import (
    "some/logs"
)

var count int

func init() {
    logs.Debug(count)
}

// Do do
func Do() {
    logs.Debug("dd")
}

jedes Paket (Hauptpaket oder beliebiges Testpaket) importiert es als leeren Import:

_ "printfcoder.com/we/models/demo"

oder importiert es und verwendet die Funktion:

"printfcoder.com/we/models/demo"

func someFunc(){
   demo.Do()
}

das init wird nur einmal 0 protokollieren. das erste Paket, das es verwendet, führt seine init-Funktion vor der init des Pakets aus. Also:

A ruft B auf, B ruft C auf, alle haben init-Funktionen, die init von C wird zuerst vor B's init ausgeführt, B's vor A's.

-1voto

harold ramos Punkte 597

Die init-Funktion wird zuerst ausgeführt und dann main. Sie wird verwendet, um etwas vor dem Programmstart einzustellen, zum Beispiel:

Zugriff auf eine Vorlage, Ausführen des Programms unter Verwendung aller Kerne, Überprüfen der Goos und Architektur usw.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X