---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Injicering av variabler vid kompileringstid i Go: användning av go build -ldflags -X'
description: Denna text behandlar hur man injicerar värden för Go-strängvariabler vid kompileringstid genom att använda länkarflaggan `-ldflags "-X"` med `go build` och ange symbolens paketsökväg, utan någon extern .env-fil.
language: sv
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## Bakgrund

I samband med ett företagsprojekt jag nyligen arbetade med undersökte jag om det finns ett sätt att injicera variabler vid kompileringstid utan en `.env`-fil.
Jag tänkte att detta skulle vara mycket bekvämt eftersom man då bara behöver en enda fil utan `.env` eller flera konfigurationsfiler.

Först letade jag efter ett `go:generate`-CLI som genererar en konstantfil utifrån `.env`, men sådant fanns inte.

Men om det ändå var så skulle man lika gärna kunna ändra constants direkt, och det var onödigt krångligt att behöva köra gen, så jag letade vidare och fann metoder för att injicera värden vid kompileringstid, till exempel makrot `include_bytes!` i Rust.

## Injicering av variabler vid kompileringstid

Användningen är enkel.

```go
package main

import "fmt"

var Foo string

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

Givet kod som ovan kan man vid bygget injicera värde på följande sätt.

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

När argumentet skickas via ldflag injiceras värdet `bar` i variabeln `Foo` vid kompileringstid. Det är enkelt.

Om samma paketnamn eller variabelnamn förekommer på flera ställen i projektet kan man ange **paketsökvägen**.

```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 sådana fall kan man injicera värden genom att särskilja dem på följande sätt:

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

Även när flera variabler finns i samma paket räcker det att skicka ytterligare argument.

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

Egenskaperna är följande:

- **Variabeln behöver inte vara publik**: även variabler som börjar med gemener kan injiceras
- **Endast stringtyp stöds**: andra typer stöds inte

## Referenser

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