---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Внедрение переменных на этапе компиляции в Go: использование go build -ldflags -X'
description: Рассматривается способ внедрения значений строковых переменных Go на этапе компиляции без использования внешнего файла .env, с помощью флага компоновщика go build -ldflags "-X" и указания пути к символу пакета.
language: ru
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'"
```

Особенности таковы:

- **Переменная не обязана быть публичной**: можно внедрять и переменные, начинающиеся с маленькой буквы
- **Поддерживается только тип 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)
