Belajar Golang - Konfigurasi Aplikasi, Environment Variables, dan Flags
Episode 7 of 19

Belajar Golang - Konfigurasi Aplikasi, Environment Variables, dan Flags

Episode ini membahas pengelolaan konfigurasi aplikasi Go: membaca environment variables dengan os.Getenv, file .env, CLI flags dengan paket flag, framework modern cobra, serta best practice konfigurasi untuk local, staging, dan production.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Hardcode nilai konfigurasi — port, kredensial database, URL API — adalah salah satu dosa terbesar dalam pengembangan aplikasi. Nilai yang berbeda di local, staging, dan production harus bisa diubah tanpa menyentuh kode.

Episode 7 mengajarkan cara mengelola konfigurasi secara idiomatik di Go: membaca environment variables, memuat file .env saat development, menangani CLI flags dengan paket flag bawaan, membangun CLI yang lebih besar dengan cobra, dan menyusun strategi konfigurasi per environment. Di akhir episode, aplikasi kalian siap berpindah antar environment tanpa mengubah satu baris pun.

Environment Variables

Membaca dengan os.Getenv

Cara paling sederhana membaca konfigurasi adalah environment variables lewat os.Getenv. Nilai yang tidak diset mengembalikan string kosong, jadi selalu beri default yang aman.

Membaca environment variable
package main
 
import (
	"fmt"
	"os"
)
 
func main() {
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
	}
	fmt.Println("server berjalan di port", port)
}

Untuk membedakan variable yang tidak diset dengan yang diset kosong, gunakan os.LookupEnv yang mengembalikan dua nilai: nilai dan status keberadaan.

Menyimpan Secret di Environment

Kredensial dan secret tidak boleh masuk ke repository. Pada deployment, environment variable diinjeksi oleh platform — Kubernetes lewat secret, GitHub Actions lewat secrets, atau container runtime. Pastikan file .env dan .env.local masuk .gitignore.

Mengatur variable di terminal
export DATABASE_URL="postgres://user:pass@localhost:5432/app"
go run main.go

File .env Saat Development

Memuat File .env

Di environment lokal, mengetik belasan export setiap kali membuka terminal sangat merepotkan. Solusi umum: simpan nilai di file .env dan muat saat development. Paket populer untuk ini adalah github.com/joho/godotenv.

Contoh .env
PORT=8080
DATABASE_URL=postgres://user:pass@localhost:5432/app
LOG_LEVEL=debug
Memuat .env
package main
 
import (
	"log"
	"os"
 
	"github.com/joho/godotenv"
)
 
func main() {
	if err := godotenv.Load(); err != nil {
		log.Println("file .env tidak ditemukan, pakai environment")
	}
	log.Println("port:", os.Getenv("PORT"))
}

godotenv.Load() memuat file .env ke dalam process environment. Jangan commit file ini ke repository; sediakan contohnya di .env.example tanpa nilai rahasia.

Prioritas Konfigurasi

Tetapkan urutan prioritas yang jelas: nilai yang sudah diset di environment menang, lalu file .env, lalu default di kode. Dengan urutan ini, production yang memakai environment variable tidak akan tertimpa default yang salah.

CLI Flags dengan Paket flag

Paket flag bawaan Go cukup untuk CLI sederhana. flag.Int, flag.String, dan sejenisnya mendaftarkan flag, lalu flag.Parse() memproses argumen.

CLI dengan paket flag
package main
 
import (
	"flag"
	"fmt"
)
 
func main() {
	port := flag.Int("port", 8080, "port server")
	debug := flag.Bool("debug", false, "mode debug")
	flag.Parse()
 
	fmt.Println("port:", *port, "debug:", *debug)
}

Jalankan dengan go run main.go -port 9090 -debug. Perhatikan flag disimpan sebagai pointer, sehingga dibaca dengan dereference *port.

flag dan Environment Bekerja Sama

Kombinasi ini memberi fleksibilitas maksimal — skrip pipeline bisa melewati flag, sementara container cukup memakai environment.

Default flag dari environment
port := flag.Int("port", 8080, "port server")
if envPort := os.Getenv("PORT"); envPort != "" {
	fmt.Sscanf(envPort, "%d", port)
}

Cobra untuk CLI Modern

Untuk CLI yang kompleks dengan banyak subcommand — seperti kubectl get pods atau docker compose up — paket cobra menjadi standar industri. Cobra menangani subcommand, flags, help, dan autocomplete secara terstruktur.

Menambah cobra
go get github.com/spf13/cobra
Root command dengan cobra
package main
 
import (
	"fmt"
	"os"
 
	"github.com/spf13/cobra"
)
 
func main() {
	var nama string
	root := &cobra.Command{
		Use:   "salam",
		Short: "CLI sederhana dengan cobra",
		Run: func(cmd *cobra.Command, args []string) {
			fmt.Println("Halo,", nama)
		},
	}
	root.Flags().StringVar(&nama, "nama", "dunia", "nama yang disapa")
 
	if err := root.Execute(); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
}

Cobra mengorganisasi command, subcommand, dan flags dalam satu pohon, dengan generate help dan completion otomatis.

Best Practice Konfigurasi per Environment

Beberapa praktik yang terbukti di production:

  • Jangan commit secret: simpan di secret manager atau platform tooling.
  • Gunakan file config terpisah untuk nilai non-rahasia per environment, misalnya config.local.yaml dan config.prod.yaml.
  • Validasi konfigurasi saat startup: aplikasi gagal cepat dengan pesan jelas, bukan menunggu error acak saat runtime.
  • Batasi jumlah source: environment, file config, dan flags — jangan tambah sumber lain tanpa alasan kuat.
  • Versi konfigurasi: dalam sistem terdistribusi, catat versi konfigurasi agar mudah didiagnosis saat perilaku berubah antar deployment.

Dengan pola ini, tim bisa berpindah dari local ke staging ke production hanya dengan mengganti environment variables dan file config.

Penutup

Episode 7 melengkapi kalian dengan strategi konfigurasi menyeluruh: membaca environment variables dengan os.Getenv dan os.LookupEnv, memuat file .env dengan godotenv untuk development, menangani CLI flags dengan paket flag, membangun CLI modern dengan cobra, serta best practice konfigurasi per environment.

Inti yang harus dibawa pulang:

  • Jangan hardcode konfigurasi; baca dari environment.
  • os.LookupEnv membedakan variable kosong dan tidak diset.
  • .env hanya untuk development dan jangan pernah di-commit.
  • Urutan prioritas: environment, file config, lalu default.
  • Paket flag cukup untuk CLI sederhana; cobra untuk yang kompleks.
  • Validasi konfigurasi di awal startup dengan pesan yang jelas.

Di episode 8 selanjutnya kita akan membahas database, persistence, dan data access — koneksi database dengan database/sql dan driver populer, penggunaan ORM ringan seperti sqlc, ent, atau gorm, serta pola data access, parameterized query, dan transaction management.