---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Injeção de variáveis em tempo de compilação no Go: uso de go build -ldflags -X'
description: Este texto aborda como injetar valores de variáveis de string em Go em tempo de compilação, sem arquivo .env externo, utilizando a flag de linker `go build -ldflags "-X"` e especificando o caminho do símbolo do pacote.
language: pt
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## Contexto

Ao trabalhar em um projeto da empresa, procurei uma forma de injetar variáveis em tempo de compilação sem usar `.env`.
Achei que, dessa forma, bastaria um único arquivo, sem `.env` nem vários arquivos de configuração, o que seria bastante conveniente.

Inicialmente, procurei uma CLI do tipo `go:generate` que gerasse um arquivo de constantes a partir de um `.env`, mas não encontrei nenhuma.

Porém, se fosse para isso, bastaria simplesmente modificar as constants, não havendo necessidade de se incomodar com a geração; foi então que encontrei um método de injetar valores em tempo de compilação, semelhante à macro `include_bytes!` do Rust.

## Injeção de variáveis em tempo de compilação

O uso é simples.

```go
package main

import "fmt"

var Foo string

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

Dado um código como o acima, é possível injetar o valor durante o build da seguinte forma.

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

Ao passar o argumento pela ldflag, o valor `bar` é injetado na variável `Foo` em tempo de compilação. É simples.

Se houver pacotes ou variáveis com o mesmo nome em vários lugares do projeto, basta **especificar o caminho do pacote**.

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

var Version string

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

var BuildTime string
```

Nesses casos, é possível injetar os valores diferenciando-os da seguinte forma:

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

Mesmo que haja várias variáveis no mesmo pacote, basta passar argumentos adicionais.

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

As características são as seguintes:

- **A variável não precisa ser pública**: também é possível injetar valores em variáveis cujo nome começa com letra minúscula.
- **Suporta apenas o tipo string**: outros tipos não são suportados.

## Referências

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