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.

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.
Cara paling sederhana membaca konfigurasi adalah environment variables lewat os.Getenv. Nilai yang tidak diset mengembalikan string kosong, jadi selalu beri default yang aman.
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.
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.
export DATABASE_URL="postgres://user:pass@localhost:5432/app"
go run main.goDi 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.
PORT=8080
DATABASE_URL=postgres://user:pass@localhost:5432/app
LOG_LEVEL=debugpackage 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.
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.
Paket flag bawaan Go cukup untuk CLI sederhana. flag.Int, flag.String, dan sejenisnya mendaftarkan flag, lalu flag.Parse() memproses argumen.
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.
Kombinasi ini memberi fleksibilitas maksimal — skrip pipeline bisa melewati flag, sementara container cukup memakai environment.
port := flag.Int("port", 8080, "port server")
if envPort := os.Getenv("PORT"); envPort != "" {
fmt.Sscanf(envPort, "%d", port)
}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.
go get github.com/spf13/cobrapackage 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.
Beberapa praktik yang terbukti di production:
config.local.yaml dan config.prod.yaml.Dengan pola ini, tim bisa berpindah dari local ke staging ke production hanya dengan mengganti environment variables dan file config.
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:
os.LookupEnv membedakan variable kosong dan tidak diset..env hanya untuk development dan jangan pernah di-commit.flag cukup untuk CLI sederhana; cobra untuk yang kompleks.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.