Mengelola Environment Variables untuk Local Development di Go
3 min read

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 .env ke repository
  • 📄 Tambahkan .env ke .gitignore
  • 🔐 Gunakan secret manager untuk production
  • 🧪 Gunakan .env.example sebagai dokumentasi konfigurasi
  • ⚙️ Validasi semua env penting saat startup

Alur Kerja yang Direkomendasikan

  1. Gunakan .env hanya untuk local development
  2. Load .env di awal aplikasi
  3. Gunakan os.Getenv / LookupEnv
  4. Validasi konfigurasi di startup
  5. 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.