Ce face init()
Orice pachet poate avea una sau mai multe funcții func init(), fără parametri și fără rezultate. Ele nu se apelează niciodată din cod: Go le rulează automat o singură dată, după ce variabilele de la nivelul pachetului au primit valori și înainte de main().
Ordinea: întâi pachetele importate (cu init-urile lor), apoi variabilele pachetului curent, apoi init-urile lui în ordinea în care apar în fișiere, apoi main. Se folosește pentru pregătiri care nu se pot scrie într-o simplă expresie: tabele calculate, verificări de configurare, înregistrarea unui driver.
Folosește init cu măsură: codul care rulează „ascuns” la import face programul greu de înțeles și de testat. Dacă pregătirea poate eșua, o funcție normală care returnează o eroare este mai bună.
Exemple
Exemplul 1: Ordinea de execuție
package main
import "fmt"
var config = incarca()
func incarca() string {
fmt.Println("1. inițializez variabila config")
return "producție"
}
func init() {
fmt.Println("2. primul init, config =", config)
}
func init() {
fmt.Println("3. al doilea init")
}
func main() {
fmt.Println("4. main")
}
Rezultat
1. inițializez variabila config
2. primul init, config = producție
3. al doilea init
4. main
Exemplul 2: Tabel calculat la pornire
package main
import "fmt"
var patrate [11]int
func init() {
for i := range patrate {
patrate[i] = i * i
}
}
func main() {
fmt.Println("7² =", patrate[7])
fmt.Println(patrate)
}
Rezultat
7² = 49
[0 1 4 9 16 25 36 49 64 81 100]
Greșeli frecvente
- Apelarea directă a lui
init():undefined: init. Nu se poate apela. - Logică grea sau acces la rețea în
init: încetinește pornirea și orice test care importă pachetul. - Bazarea pe ordinea
init-urilor din fișiere diferite ale aceluiași pachet: depinde de numele fișierelor.
Comenzi înrudite
package și pachetul main: Fiecare fișier Go începe cu package; pachetul main cu funcția main() devine un program executabil.import: Aduce în fișier pachete din biblioteca standard sau din alte module; numele pachetului devine prefixul folosit.var și :=: Declară variabile: var cu tip sau valoare inițială, sau := (declarare scurtă cu tip dedus) în funcții.