---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Injectarea variabilelor la timpul compilării în Go: utilizarea go build -ldflags -X'
description: Acest material prezintă modul de injectare a valorilor variabilelor de tip șir din Go în timpul compilării, fără a utiliza un fișier .env extern, prin specificarea indicatorului de linker go build -ldflags "-X" și a căii simbolului pachetului.
language: ro
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## Context

Recent, în timpul lucrului la un proiect al companiei, am căutat o metodă de a injecta variabile în timpul compilării fără a folosi `.env`.
Consideram că, dacă ar fi posibil, ar fi foarte convenabil, deoarece ar fi suficient un singur fișier, fără `.env` sau mai multe fișiere de configurare.

Inițial, am căutat un CLI de tip `go:generate` care să genereze un fișier de constante pe baza unui `.env`, însă nu am găsit unul.

Totuși, dacă e să fac asta, de ce nu aș modifica direct constantele, fără a mai trece prin pasul suplimentar de generare? Atunci am descoperit, în Rust, macroul `include_bytes!` și alte modalități de a injecta valori în timpul compilării.

## Injectarea variabilelor în timpul compilării

Modul de utilizare este simplu.

```go
package main

import "fmt"

var Foo string

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

Pentru codul de mai sus, la build se poate injecta valoarea astfel:

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

Prin transmiterea argumentului prin ldflag, valoarea `bar` este injectată în variabila `Foo` în timpul compilării. Este simplu.

Dacă în proiect există pachete sau variabile cu același nume în mai multe locuri, este suficient să se **specifice calea pachetului**.

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

var Version string

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

var BuildTime string
```

În acest caz, injectarea se poate face diferențiat, astfel:

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

Dacă în același pachet există mai multe variabile, este suficient să se transmită argumente suplimentare.

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

Caracteristicile sunt următoarele:

- **Variabila nu trebuie să fie publică**: se poate injecta și o variabilă al cărei nume începe cu literă mică
- **Suportă doar tipul string**: celelalte tipuri nu sunt suportate

## Referințe

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