00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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

  1. Variabili di pacchetto vengono inizializzate
  2. Funzioni init() vengono eseguite
  3. 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.