Go Config ENV Loader
Definisi
Konfigurasi aplikasi Go sebaiknya berangkat dari environment variable. Untuk development lokal, env loader seperti godotenv bisa membantu membaca file .env.
spf13/viper tetap berguna, tapi posisinya opsional. Pakai Viper kalau kamu memang butuh gabungan file config, env, flag, dan watch/reload. Kalau kebutuhanmu cuma baca env lalu isi struct config, jangan langsung naik kelas ke Viper.
Kapan dipakai
Pola ini cocok kalau:
- aplikasi jalan di Docker, CI, atau server production
- nilai config berbeda antar environment
- kamu ingin default aman di code, lalu override dari env
.envhanya dipakai untuk development lokal- project belum butuh reload config atau banyak sumber config
Cara kerja
Alur yang paling sederhana:
- set default di code
- baca
.envhanya untuk local development - override pakai environment variable
- map hasilnya ke struct config
- pakai Viper hanya kalau memang perlu multi-source config
Contoh loader sederhana
package config
import "os"
type Config struct {
AppPort string
DBHost string
DBUser string
DBPass string
}
func Load() Config {
cfg := Config{
AppPort: "8080",
DBHost: "127.0.0.1",
DBUser: "root",
DBPass: "",
}
if v := os.Getenv("APP_PORT"); v != "" {
cfg.AppPort = v
}
if v := os.Getenv("DB_HOST"); v != "" {
cfg.DBHost = v
}
if v := os.Getenv("DB_USER"); v != "" {
cfg.DBUser = v
}
if v := os.Getenv("DB_PASS"); v != "" {
cfg.DBPass = v
}
return cfg
}Contoh .env untuk development
APP_PORT=3000
DB_HOST=127.0.0.1
DB_USER=root
DB_PASS=secretContoh pemakaian env loader
if err := godotenv.Load(); err != nil {
// aman kalau file .env tidak ada di production
}
cfg := config.Load()Kalau butuh Viper
import "github.com/spf13/viper"
viper.SetDefault("app.port", "8080")
viper.AutomaticEnv()
_ = viper.ReadInConfig()
port := viper.GetString("app.port")Diagram alur
Loading diagram...
Catatan implementasi
os.Getenvatauos.LookupEnvsudah cukup untuk banyak aplikasi Go..envadalah alat bantu development, bukan sumber konfigurasi utama production.- Simpan config dalam struct agar nilai yang dipakai aplikasi jelas dan mudah dites.
- Viper sebaiknya dianggap alternatif, bukan default.
- Kalau kamu cuma perlu baca env + default value, loader kecil buatan sendiri sering lebih simpel.
Kesalahan umum
- Menganggap
.envsama dengan environment production. - Menaruh secret default langsung di source code.
- Pakai Viper walau kebutuhan sebenarnya cuma baca env.
- Menyimpan config sebagai global mutable tanpa struct.
- Tidak memvalidasi value config sebelum dipakai.