---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Инжектиране на променливи по време на компилация в Go: използване на go build -ldflags -X'
description: Тази статия разглежда как да се инжектират стойности на низови променливи на Go по време на компилация, без външен .env файл, като се използва линкерният флаг `go build -ldflags "-X"` и се посочва пълният път до символа на пакета.
language: bg
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## Предистория

В рамките на текущия проект в компанията търсих начин за инжектиране на променливи по време на компилация без използване на .env файл.
Смятах, че ако това е възможно, ще е много удобно, тъй като ще е необходим само един файл, без .env или множество конфигурационни файлове.

Първоначално потърсих CLI инструмент за `go:generate`, който генерира файл с константи въз основа на .env, но такъв не намерих.

Но ако е така, би било по-просто да се редактират директно constants, без да се правят излишни стъпки за генериране. Тогава открих, че в Rust има възможности за инжектиране на стойности по време на компилация, като например макроса `include_bytes!`.

## Инжектиране на променливи по време на компилация

Употребата е проста.

```go
package main

import "fmt"

var Foo string

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

При наличие на горния код, по време на билд може да се инжектира стойност по следния начин.

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

Чрез подаване на аргумент с ldflag, стойността `bar` се инжектира в променливата `Foo` по време на компилация. Просто е.

Ако в проекта има пакети или променливи с едно и също име на различни места, може да се **посочи пътят до пакета**.

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

var Version string

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

var BuildTime string
```

В такъв случай може да се инжектират стойности, като се разграничат по следния начин:

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

Когато в един и същи пакет има няколко променливи, е достатъчно да се подадат допълнителни аргументи.

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

Характеристиките са следните:

- **Променливата не е задължително public**: може да се инжектира и променлива, започваща с малка буква
- **Поддържа се само тип string**: други типове не се поддържат

## Референции

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