---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Injektion af variabler ved kompileringstid i Go: anvendelse af go build -ldflags -X'
description: Dette dokument beskriver, hvordan man injicerer værdier i Go-strengvariabler under kompileringstiden ved hjælp af linker-flaget `go build -ldflags "-X"` og ved at angive pakkens symbolsti, uden en ekstern .env-fil.
language: da
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## Baggrund

I forbindelse med et virksomhedsprojekt undersøgte jeg, om der findes en metode til at injicere variabler på kompileringstidspunktet uden brug af `.env`.
Jeg mente, at dette ville være meget praktisk, da kun en enkelt fil ville være nødvendig uden `.env`-filer eller flere konfigurationsfiler.

Til at begynde med ledte jeg efter et `go:generate`-CLI, der genererer en konstantfil baseret på `.env`, men jeg fandt ingen.

Hvis det var sådan, kunne man dog lige så godt redigere constants direkte, og det var ikke nødvendigt at besvære sig med at køre gen. Jeg fandt så en metode, der kan injicere værdier på kompileringstidspunktet, ligesom `include_bytes!`-makroen i Rust.

## Injektion af variabler på kompileringstidspunktet

Brugen er enkel.

```go
package main

import "fmt"

var Foo string

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

Givet en kode som ovenfor, kan man ved build injicere værdien på følgende måde.

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

Når argumentet overføres via ldflag, injiceres værdien `bar` i variablen `Foo` på kompileringstidspunktet under build. Det er ligetil.

Hvis der i projektet findes pakker eller variabler med samme navn flere steder, kan man **angive pakkestien**.

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

var Version string

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

var BuildTime string
```

I et sådant tilfælde kan man injicere værdierne ved at skelne dem på følgende måde:

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

Når der er flere variabler i samme pakke, skal man blot tilføje yderligere argumenter.

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

Egenskaberne er som følger:

- **Variablen behøver ikke at være public**: Variabler, der starter med et lille bogstav, kan også injiceres.
- **Kun string-typen understøttes**: Andre typer understøttes ikke.

## Referencer

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