Injeksi Variabel Waktu Kompilasi Go: Penggunaan go build -ldflags -X

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.
1package main
2
3import "fmt"
4
5var Foo string
6
7func main() {
8 fmt.Println(Foo)
9}
Jika terdapat kode seperti di atas, saat proses build, variabel tersebut dapat disisipkan dengan cara berikut.
1go 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).
1// github.com/myproject/config/config.go
2package config
3
4var Version string
5
6// github.com/myproject/internal/config/config.go
7package config
8
9var BuildTime string
Dalam kasus seperti ini, keduanya dapat dibedakan dan disisipkan dengan cara berikut:
1go 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.
1go 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.