---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Go-compileertijdvariabelen injecteren: gebruik van go build -ldflags -X'
description: Dit artikel behandelt hoe je tijdens het compileren waarden voor Go-stringvariabelen kunt injecteren door de linkerflag van go build -ldflags "-X" te gebruiken en het symboolpad van het pakket op te geven, zonder een extern .env-bestand te gebruiken.
language: nl
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## Achtergrond

Tijdens een bedrijfsproject ben ik op zoek gegaan naar een manier om variabelen tijdens de compilatie te injecteren zonder gebruik te maken van een `.env`-bestand.
Ik dacht dat dit erg handig zou zijn, omdat je dan alleen een enkel bestand nodig hebt in plaats van een `.env`-bestand of meerdere configuratiebestanden.

Allereerst heb ik gezocht naar een `go:generate` CLI-tool die een constantenbestand genereert op basis van een `.env`-bestand, maar die heb ik niet gevonden.

Als dat het geval is, dan kan ik de constants gewoon zelf aanpassen, en hoef ik niet de moeite te nemen om een generatiestap uit te voeren. Vervolgens vond ik in Rust de `include_bytes!`-macro, waarmee waarden tijdens de compilatie kunnen worden geïnjecteerd.

## Compilatietijd-variabelen injecteren

Het gebruik is eenvoudig.

```go
package main

import "fmt"

var Foo string

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

Stel dat je bovenstaande code hebt, dan kun je tijdens het bouwen het volgende injecteren.

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

Door het argument via de ldflag door te geven, wordt de waarde `bar` tijdens de compilatie in de variabele `Foo` geïnjecteerd. Het is eenvoudig.

Als er in het project meerdere pakketten of variabelen met dezelfde naam bestaan, dan **kun je het pakketpad opgeven**.

```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 dit geval kun je als volgt onderscheid maken bij het injecteren:

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

Ook wanneer er meerdere variabelen in hetzelfde pakket staan, volstaat het om extra argumenten door te geven.

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

De kenmerken zijn als volgt:

- **De variabele hoeft niet publiek te zijn**: ook variabelen die met een kleine letter beginnen, kunnen worden geïnjecteerd.
- **Alleen het string-type wordt ondersteund**: andere typen worden niet ondersteund.

## Referenties

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