package config import ( "fmt" "os" "strings" "github.com/spf13/viper" ) func Load() (*Config, error) { env := getEnv("APP_ENV", "dev") v := viper.New() v.SetConfigType("yaml") // ✅ 默认值 setDefaults(v) // ✅ 支持环境变量(如 APP_PORT → app.port) v.AutomaticEnv() v.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) // 基础配置 v.AddConfigPath("configs") v.SetConfigName("config") if err := v.ReadInConfig(); err != nil { return nil, fmt.Errorf("读取基础配置失败: %w", err) } // 环境配置(覆盖) envConfigName := fmt.Sprintf("config.%s", env) v.SetConfigName(envConfigName) if err := v.MergeInConfig(); err != nil { // dev 可以没有,prod 必须有 if env == "prod" { return nil, fmt.Errorf("读取环境配置失败(%s): %w", env, err) } } var cfg Config if err := v.Unmarshal(&cfg); err != nil { return nil, fmt.Errorf("解析配置失败: %w", err) } return &cfg, nil } // ✅ 默认值统一在这里管理 func setDefaults(v *viper.Viper) { v.SetDefault("app.name", "allapp-go") v.SetDefault("app.port", 8080) v.SetDefault("app.base_url", "app") // 可以继续扩展 v.SetDefault("unique_id.datacenter_id", 1) v.SetDefault("unique_id.worker_id", 1) } func getEnv(key, defaultVal string) string { val := os.Getenv(key) if val == "" { return defaultVal } return strings.ToLower(val) }