---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Injection de variables à la compilation en Go : utilisation de go build -ldflags -X'
description: Ce texte explique comment injecter des valeurs de variables de chaîne Go au moment de la compilation, sans fichier .env externe, en utilisant le drapeau de l'éditeur de liens go build -ldflags "-X" et en spécifiant le chemin du symbole du package.
language: fr
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## Contexte

Lors de mon travail sur un projet d'entreprise, j'ai cherché une méthode permettant d'injecter des variables au moment de la compilation sans utiliser de fichier `.env`.
Je pensais que cela serait très pratique, car un seul fichier suffirait, sans avoir besoin de `.env` ni de plusieurs fichiers de configuration.

Au départ, j'ai cherché un outil CLI de type `go:generate` qui générerait un fichier de constantes à partir d'un `.env`, mais je n'en ai pas trouvé.

Toutefois, dans ce cas, il suffisait de modifier directement les constantes, sans avoir à passer par une étape de génération fastidieuse. J'ai alors découvert, en Rust, des moyens d'injecter des valeurs au moment de la compilation, comme la macro `include_bytes!`.

## Injection de variables au moment de la compilation

L'utilisation est simple.

```go
package main

import "fmt"

var Foo string

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

Pour le code ci-dessus, il est possible d'injecter une valeur lors de la compilation de la manière suivante.

```bash
go build -ldflags="-X 'main.Foo=bar'"
```

En transmettant un argument via ldflags, la valeur `bar` est injectée dans la variable `Foo` au moment de la compilation. C'est simple.

Si plusieurs packages ou variables portant le même nom existent dans le projet, il suffit de **spécifier le chemin du package**.

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

var Version string

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

var BuildTime string
```

Dans ce cas, il est possible d'effectuer l'injection en les distinguant de la manière suivante :

```bash
go build -ldflags="-X 'github.com/myproject/config.Version=v1.0.0' -X 'github.com/myproject/internal/config.BuildTime=2025-05-27'"
```

Lorsque plusieurs variables se trouvent dans le même package, il suffit de transmettre des arguments supplémentaires.

```bash
go build -ldflags="-X 'main.Version=v1.0.0' -X 'main.BuildTime=2025-05-27' -X 'main.GitCommit=abc123'"
```

Les caractéristiques sont les suivantes :

- **Il n'est pas nécessaire que la variable soit publique** : une variable commençant par une minuscule peut également être injectée.
- **Seul le type string est pris en charge** : les autres types ne sont pas supportés.

## Références

- [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)
