Funzione Init in Go
La funzione init() in Go è una funzione speciale che viene eseguita automaticamente prima della funzione main(). Viene utilizzata per inizializzare lo stato del pacchetto.
Sintassi Base
package main
import "fmt"
func init() {
fmt.Println("init() eseguita")
}
func main() {
fmt.Println("main() eseguita")
}
// Output:
// init() eseguita
// main() eseguita
Caratteristiche di init()
- Non accetta parametri
- Non restituisce valori
- Viene chiamata automaticamente (non può essere invocata manualmente)
- Viene eseguita dopo l’inizializzazione delle variabili di pacchetto
Ordine di Esecuzione
- Variabili di pacchetto vengono inizializzate
- Funzioni
init()vengono eseguite - La funzione
main()viene eseguita
var config = caricaDefault() // 1. Prima le variabili
func init() {
// 2. Poi init()
fmt.Println("Configurazione inizializzata")
}
func main() {
// 3. Infine main()
fmt.Println("Programma avviato")
}
Multiple init() nello Stesso File
Un singolo file può contenere più funzioni init():
func init() {
fmt.Println("Prima init")
}
func init() {
fmt.Println("Seconda init")
}
// Vengono eseguite nell'ordine in cui appaiono nel file
init() tra Pacchetti
Quando un pacchetto importa altri pacchetti, le init() vengono eseguite in ordine di dipendenza:
// pacchetto database
func init() {
fmt.Println("Database init") // Eseguita per prima
}
// pacchetto main (importa database)
import "database"
func init() {
fmt.Println("Main init") // Eseguita dopo database init
}
Casi d’Uso Comuni
Registrare Driver
import _ "github.com/lib/pq" // L'import blank esegue solo init()
// Nel pacchetto pq:
func init() {
sql.Register("postgres", &Driver{})
}
Verificare Configurazione
func init() {
if os.Getenv("API_KEY") == "" {
log.Fatal("API_KEY non configurata")
}
}
Inizializzare Strutture Dati
var templates map[string]*template.Template
func init() {
templates = make(map[string]*template.Template)
templates["home"] = template.Must(template.ParseFiles("home.html"))
templates["about"] = template.Must(template.ParseFiles("about.html"))
}
Best Practice
- Usa
init()solo per inizializzazioni semplici e deterministiche - Evita effetti collaterali complessi o chiamate di rete in
init() - Preferisci funzioni di inizializzazione esplicite per logica complessa
- Non fare affidamento sull’ordine di
init()tra file diversi dello stesso pacchetto
Conclusione
La funzione init() è uno strumento utile per preparare lo stato iniziale di un pacchetto. Va usata con moderazione: per inizializzazioni complesse è preferibile usare funzioni esplicite chiamate in main(), che rendono il flusso del programma più chiaro e testabile.