Mengelola Environment Variables untuk Local Development di Go
Dalam pengembangan aplikasi Go, environment variables adalah mekanisme yang sangat umum dan direkomendasikan untuk menyimpan konfigurasi aplikasi, seperti:
- Port aplikasi
- Database credential
- API key
- Feature flag
Pendekatan ini membantu kita memisahkan konfigurasi dari kode, sehingga kode tetap bersih, aman, dan mudah dipindahkan ke berbagai environment (development, staging, production) tanpa perubahan kode.
Kenapa Environment Variables Penting?
Beberapa alasan utama penggunaan environment variables:
- ❌ Menghindari hard‑code nilai sensitif di kode
- ✅ Konfigurasi bisa berbeda di tiap environment
- ✅ Lebih mudah diintegrasikan dengan CI/CD, container, dan cloud platform
- ✅ Sesuai dengan prinsip 12‑Factor App
Membaca Environment Variable di Go
Go menyediakan package bawaan os untuk membaca environment variables.
Contoh Dasar
package main
import (
"fmt"
"os"
)
func main() {
dbHost := os.Getenv("DB_HOST")
fmt.Println("DB Host:", dbHost)
}
Jika variabel tidak ada, os.Getenv akan mengembalikan string kosong.
Menggunakan os.LookupEnv
Untuk mengetahui apakah variabel memang ada atau tidak:
value, ok := os.LookupEnv("DB_HOST")
if !ok {
panic("DB_HOST is not set")
}
Pendekatan ini cocok untuk konfigurasi wajib.
Menetapkan Nilai Default
Untuk konfigurasi opsional, biasanya kita ingin nilai default:
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
Dengan cara ini, aplikasi tetap bisa berjalan di local tanpa banyak setup.
Menggunakan File .env untuk Local Development
Go tidak membaca file .env secara native. Untuk local development, biasanya digunakan library seperti github.com/joho/godotenv.
Instalasi
go get github.com/joho/godotenv
Contoh File .env
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=secret
PORT=8080
Load .env di Aplikasi
package main
import (
"log"
"os"
"github.com/joho/godotenv"
)
func main() {
if err := godotenv.Load(); err != nil {
log.Println(".env file not found, fallback to environment")
}
port := os.Getenv("PORT")
log.Println("App running on port", port)
}
File .env hanya digunakan untuk local development, bukan untuk production.
Validasi Environment Variables di Startup
Best practice yang sangat penting adalah fail fast jika konfigurasi penting tidak tersedia.
required := []string{
"DB_HOST",
"DB_USER",
"DB_PASSWORD",
}
for _, key := range required {
if os.Getenv(key) == "" {
log.Fatalf("Missing required env var: %s", key)
}
}
Dengan validasi di awal, error tidak akan muncul di tengah runtime.
Struktur Config yang Lebih Rapi
Untuk project yang mulai besar, biasanya environment variables dipetakan ke struct:
type Config struct {
Port string
DBHost string
DBUser string
DBPassword string
}
func LoadConfig() Config {
return Config{
Port: getEnv("PORT", "8080"),
DBHost: os.Getenv("DB_HOST"),
DBUser: os.Getenv("DB_USER"),
DBPassword: os.Getenv("DB_PASSWORD"),
}
}
func getEnv(key, fallback string) string {
if value := os.Getenv(key); value != "" {
return value
}
return fallback
}
Pendekatan ini membuat config lebih terstruktur dan mudah di-maintain.
Praktik Terbaik
- 🚫 Jangan commit file
.envke repository - 📄 Tambahkan
.envke.gitignore - 🔐 Gunakan secret manager untuk production
- 🧪 Gunakan
.env.examplesebagai dokumentasi konfigurasi - ⚙️ Validasi semua env penting saat startup
Alur Kerja yang Direkomendasikan
- Gunakan
.envhanya untuk local development - Load
.envdi awal aplikasi - Gunakan
os.Getenv/LookupEnv - Validasi konfigurasi di startup
- Inject env langsung dari sistem saat production
Kesimpulan
Mengelola environment variables dengan benar adalah fondasi penting dalam aplikasi Go.
Dengan pendekatan yang tepat:
- Konfigurasi terpisah dari kode
- Aplikasi lebih aman dan portable
- Development dan deployment menjadi lebih konsisten
Gunakan environment variables sebagai sumber kebenaran konfigurasi, dan jadikan .env hanya sebagai alat bantu untuk local development.