---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Injeksi Variabel Waktu Kompilasi Go: Penggunaan go build -ldflags -X'
description: Artikel ini membahas cara menyisipkan nilai variabel string Go pada waktu kompilasi tanpa file .env eksternal, dengan menggunakan flag linker go build -ldflags "-X" dan dengan menentukan jalur simbol paket.
language: id
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## Latar Belakang

Saat mengerjakan proyek perusahaan kali ini, saya mencari tahu apakah ada cara untuk menyisipkan variabel pada waktu kompilasi tanpa menggunakan `.env`.
Saya berpikir hal ini akan sangat praktis karena hanya membutuhkan satu file tanpa `.env` maupun berbagai file konfigurasi lainnya.

Pertama-tama, saya mencoba mencari CLI `go:generate` yang dapat membuat file konstanta berdasarkan `.env`, tetapi tidak ditemukan.

Namun, jika memang demikian, cukup ubah constants secara langsung dan tidak perlu repot menjalankan gen, lalu saya menemukan cara untuk menyisipkan nilai pada waktu kompilasi, seperti makro `include_bytes!` pada Rust.

## Penyisipan Variabel pada Waktu Kompilasi

Cara penggunaannya sederhana.

```go
package main

import "fmt"

var Foo string

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

Jika terdapat kode seperti di atas, saat proses build, variabel tersebut dapat disisipkan dengan cara berikut.

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

Dengan memberikan argumen melalui ldflag, nilai `bar` akan disisipkan ke dalam variabel `Foo` pada waktu kompilasi saat build. Sangat sederhana.

Jika dalam proyek terdapat paket atau variabel dengan nama yang sama di beberapa tempat, maka cukup **tentukan jalur paket (package path)**.

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

var Version string

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

var BuildTime string
```

Dalam kasus seperti ini, keduanya dapat dibedakan dan disisipkan dengan cara berikut:

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

Jika terdapat beberapa variabel dalam paket yang sama, cukup tambahkan argumen tambahan.

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

Ciri-cirinya adalah sebagai berikut:

- **Variabel tidak harus berawalan huruf kapital (public)**: Variabel yang diawali huruf kecil pun dapat disisipkan.
- **Hanya mendukung tipe string**: Tipe data lain tidak didukung.

## Referensi

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