---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Vloženie premenných v čase kompilácie v Go: využitie go build -ldflags -X'
description: Tento článok popisuje, ako pri kompilácii vložiť hodnoty reťazcových premenných jazyka Go bez použitia externého súboru .env, a to pomocou linkerového prepínača go build -ldflags "-X" a zadaním cesty k symbolu balíka.
language: sk
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## Pozadie

Pri práci na firemnom projekte som hľadal spôsob, ako vložiť premenné v čase kompilácie bez použitia `.env` súboru.
Myslel som si, že ak by to fungovalo, bolo by to veľmi pohodlné, pretože by stačil jediný súbor bez `.env` alebo viacerých konfiguračných súborov.

Najprv som hľadal nástroj typu `go:generate` CLI, ktorý by na základe `.env` generoval súbor s konštantami, ale žiadny som nenašiel.

Keďže však v takom prípade by stačilo jednoducho upraviť constants a nebolo potrebné zbytočne spúšťať generovanie, hľadal som ďalej a našiel som spôsob, ktorý umožňuje vkladať hodnoty v čase kompilácie, podobne ako makro `include_bytes!` v Ruste.

## Vkladanie premenných v čase kompilácie

Použitie je jednoduché.

```go
package main

import "fmt"

var Foo string

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

Ak existuje kód vyššie, pri zostavení je možné hodnotu vložiť nasledovne.

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

Ak odovzdáme argument prostredníctvom ldflag, hodnota `bar` sa počas zostavovania, teda v čase kompilácie, vloží do premennej `Foo`. Je to jednoduché.

Ak sa v projekte nachádzajú balíky alebo premenné s rovnakým názvom na viacerých miestach, stačí **uviesť 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 takom prípade je možné hodnoty rozlíšiť a vložiť nasledovne:

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

Ak sa viacero premenných nachádza v rovnakom balíku, stačí odovzdať ďalšie argumenty rovnakým spôsobom.

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

Vlastnosti sú nasledovné:

- **Premenná nemusí byť public**: vložiť možno aj premennú, ktorá začína malým písmenom
- **Podporovaný je iba typ string**: iné typy nie sú podporované

## Referencie

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