---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Injekce proměnných v době kompilace v Go: použití go build -ldflags -X'
description: Tento článek popisuje, jak během kompilace (compile time) vložit hodnoty do řetězcových proměnných jazyka Go bez použití externího souboru .env, a to pomocí linkerového příznaku go build -ldflags "-X" a zadáním cesty k symbolu balíčku.
language: cs
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## Pozadí

Při práci na firemním projektu jsem hledal způsob, jak vkládat proměnné v době kompilace bez použití `.env` souboru.
Myslel jsem si, že by to bylo velmi pohodlné, protože by stačil jediný soubor, bez `.env` nebo několika konfiguračních souborů.

Nejprve jsem hledal nástroj typu CLI pro `go:generate`, který by na základě `.env` vygeneroval soubor s konstantami, ale žádný jsem nenašel.

Pokud je to tak, pak by stačilo jednoduše upravit constants a nebylo by nutné zbytečně spouštět generování. Zároveň jsem našel možnost, jak vkládat hodnoty v době kompilace, podobnou makru `include_bytes!` v Rustu.

## Vkládání proměnných v době kompilace

Použití je jednoduché.

```go
package main

import "fmt"

var Foo string

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

Pokud máme výše uvedený kód, lze při sestavení hodnotu vložit následujícím způsobem.

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

Předáním argumentu přes ldflag se při sestavení v době kompilace do proměnné `Foo` vloží hodnota `bar`. Je to jednoduché.

Pokud se ve svém projektu nachází proměnné nebo balíčky se stejným názvem na více místech, stačí **uvést cestu k balíčku**.

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

var Version string

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

var BuildTime string
```

V takovém případě lze hodnoty rozlišit a vložit takto:

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

Pokud je více proměnných ve stejném balíčku, stačí jednoduše předat další argumenty.

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

Vlastnosti jsou následující:

- **Proměnná nemusí být veřejná**: lze vložit i hodnotu do proměnné začínající malým písmenem
- **Podporován je pouze typ string**: jiné typy nejsou podporovány

## Reference

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