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) 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 { 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", "app") 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) }