Typed environment configuration loader
Go
package main
import (
"fmt"
"os"
"strconv"
"strings"
"time"
)
// MustEnv returns the parsed value of key, or fallback when unset or invalid.
func MustEnv[T any](key string, fallback T, parse func(string) (T, error)) T {
raw, ok := os.LookupEnv(key)
if !ok || strings.TrimSpace(raw) == "" {
return fallback
}
value, err := parse(strings.TrimSpace(raw))
if err != nil {
return fallback
}
return value
}
func main() {
config := map[string]any{
"port": MustEnv("PORT", 8080, strconv.Atoi),
"debug": MustEnv("DEBUG", false, strconv.ParseBool),
"timeout": MustEnv("TIMEOUT", 5*time.Second, time.ParseDuration),
"apiBase": MustEnv("API_BASE", "https://api.example.com", func(s string) (string, error) { return s, nil }),
}
fmt.Printf("port=%v debug=%v timeout=%v base=%v\n",
config["port"], config["debug"], config["timeout"], config["apiBase"])
}