GoSuda

Compile-Time Variable Injection pada Go

By wHoIsDReAmer
views ...

Latar Belakang

Kali ini, saat mengerjakan proyek perusahaan, saya mencari tahu apakah ada cara untuk menyuntikkan variabel pada compile time tanpa menggunakan .env. Dengan demikian, saya pikir akan sangat nyaman karena hanya membutuhkan satu berkas tanpa perlu .env atau beberapa berkas konfigurasi lainnya.

Awalnya, saya mencari CLI go:generate yang dapat menghasilkan berkas constant berdasarkan .env, tetapi tidak menemukannya.

Namun, jika demikian, saya bisa saja langsung mengubah constants tanpa perlu melakukan gen yang merepotkan, dan saya menemukan cara untuk menyuntikkan nilai pada compile time seperti makro include_bytes! di Rust.

Penyuntikan Variabel pada Compile Time

Cara penggunaannya sederhana.

1package main
2
3import "fmt"
4
5var Foo string
6
7func main() {
8    fmt.Println(Foo)
9}

Jika ada kode seperti di atas, variabel dapat disuntikkan saat build sebagai berikut.

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

Jika argumen diteruskan melalui ldflag, nilai bar akan disuntikkan ke variabel Foo pada compile time saat build. Sederhana.

Jika ada beberapa package atau variabel dengan nama yang sama dalam proyek, Anda cukup menyebutkan jalur package.

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, variabel dapat disuntikkan dengan membedakannya sebagai berikut:

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

Jika ada beberapa variabel dalam package yang sama, Anda cukup meneruskan argumen tambahan.

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

Fitur-fiturnya adalah sebagai berikut:

  • Variabel tidak harus public: Variabel yang dimulai dengan huruf kecil juga dapat disuntikkan.
  • Hanya mendukung type string: Type lain tidak didukung.

Referensi