Iniezione di variabili in fase di compilazione in Go: uso di go build -ldflags -X

Contesto
In questo periodo, lavorando a un progetto aziendale, ho cercato un modo per iniettare variabili in fase di compilazione senza usare un file .env.
Ritenevo che, eliminando .env e i vari file di configurazione, bastasse un unico file, cosa che sarebbe stata molto comoda.
Inizialmente ho cercato un CLI basato su go:generate in grado di generare un file di costanti a partire da .env, ma non ne ho trovati.
Tuttavia, se fosse così, sarebbe bastato modificare direttamente le constants senza dover eseguire anche la generazione, e ho quindi trovato qualcosa come la macro include_bytes! di Rust, che permette di iniettare valori in fase di compilazione.
Iniezione di variabili in fase di compilazione
L'utilizzo è semplice.
1package main
2
3import "fmt"
4
5var Foo string
6
7func main() {
8 fmt.Println(Foo)
9}
Dato un codice come quello sopra, è possibile iniettare il valore in fase di build nel seguente modo.
1go build -ldflags="-X 'main.Foo=bar'"
Passando l'argomento tramite ldflag, il valore bar viene iniettato nella variabile Foo in fase di compilazione. È semplice.
Se nel progetto esistono pacchetti o variabili con lo stesso nome in più punti, è sufficiente specificare il percorso del pacchetto.
1// github.com/myproject/config/config.go
2package config
3
4var Version string
5
6// github.com/myproject/internal/config/config.go
7package config
8
9var BuildTime string
In questi casi è possibile distinguerli e iniettarli come segue:
1go build -ldflags="-X 'github.com/myproject/config.Version=v1.0.0' -X 'github.com/myproject/internal/config.BuildTime=2025-05-27'"
Anche quando più variabili appartengono allo stesso pacchetto, basta passare argomenti aggiuntivi.
1go build -ldflags="-X 'main.Version=v1.0.0' -X 'main.BuildTime=2025-05-27' -X 'main.GitCommit=abc123'"
Le caratteristiche sono le seguenti:
- Non è necessario che la variabile sia pubblica: è possibile iniettare anche variabili il cui nome inizia con una lettera minuscola
- Supporta solo il tipo string: altri tipi non sono supportati