---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Inyección de variables en tiempo de compilación en Go: uso de go build -ldflags -X'
description: Este documento explica cómo inyectar valores de variables de cadena de Go en tiempo de compilación, sin utilizar un archivo .env externo, mediante el flag de enlazador `-ldflags "-X"` de `go build` y especificando la ruta del símbolo del paquete.
language: es
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## Contexto

Al trabajar en un proyecto de la empresa, busqué si existía una forma de inyectar variables en tiempo de compilación sin usar `.env`.
Pensé que sería muy cómodo, ya que de este modo solo bastaría con un único archivo, sin necesidad de `.env` ni de varios archivos de configuración.

Al principio busqué una herramienta CLI de `go:generate` que generara un archivo de constantes a partir de `.env`, pero no encontré ninguna.

Sin embargo, si iba a hacer eso, bastaba con modificar directamente las constants, así que no era necesario complicarse con un paso de generación. Entonces encontré en Rust una forma de inyectar valores en tiempo de compilación, como la macro `include_bytes!`.

## Inyección de variables en tiempo de compilación

El uso es sencillo.

```go
package main

import "fmt"

var Foo string

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

Dado un código como el anterior, durante la compilación puede inyectarse de la siguiente manera.

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

Al pasar el argumento mediante ldflag, el valor `bar` se inyecta en la variable `Foo` durante la compilación. Es simple.

Si en el proyecto existen paquetes o variables con el mismo nombre en varios lugares, basta con **especificar la ruta del paquete**.

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

var Version string

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

var BuildTime string
```

En estos casos, se pueden inyectar distinguiéndolos de la siguiente manera:

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

Incluso cuando hay varias variables en el mismo paquete, basta con pasar argumentos adicionales.

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

Sus características son las siguientes:

- **La variable no necesita ser pública**: también es posible inyectar variables que comienzan con minúscula.
- **Solo se admite el tipo string**: no se soportan otros tipos.

## Referencias

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