init() în Go

Funcție specială care rulează automat la pornire, după inițializarea variabilelor pachetului și înainte de main().

Sintaxă
func init() {
    // rulează automat, înainte de main
}

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.