---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Iniezione di variabili in fase di compilazione in Go: uso di go build -ldflags -X'
description: Questo testo illustra come iniettare valori di variabili stringa Go in fase di compilazione, senza ricorrere a un file .env esterno, specificando il flag del linker `-ldflags "-X"` di go build e il percorso del simbolo del pacchetto.
language: it
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## 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.

```go
package main

import "fmt"

var Foo string

func main() {
    fmt.Println(Foo)
}
```

Dato un codice come quello sopra, è possibile iniettare il valore in fase di build nel seguente modo.

```bash
go 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**.

```go
// github.com/myproject/config/config.go
package config

var Version string

// github.com/myproject/internal/config/config.go
package config

var BuildTime string
```

In questi casi è possibile distinguerli e iniettarli come segue:

```bash
go 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.

```bash
go 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

## Riferimenti

- [https://stackoverflow.com/questions/47509272/how-to-set-package-variable-using-ldflags-x-in-golang-build](https://stackoverflow.com/questions/47509272/how-to-set-package-variable-using-ldflags-x-in-golang-build)
