package config import ( "encoding/json" "fmt" "github.com/spf13/viper" "os" "strings" "sync" ) const ( envConfigPrefix = "XH_G" ) var ( currentEnv EnvType // 当前环境变量 currentEnvOnce sync.Once currentCommit string // 当前提交的CommitID currentCommitOnce sync.Once ) type EnvType string const ( EnvDev EnvType = "dev" EnvTest EnvType = "test" EnvProd EnvType = "prod" ) // LoadConfig 加载并返回应用配置 func LoadConfig[T any](configDir string, configPtr *T) (*T, error) { v := viper.New() v.SetEnvPrefix(envConfigPrefix) v.AutomaticEnv() v.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) env := v.GetString("env") if env == "" { env = "dev" } v.SetConfigName(fmt.Sprintf("config.%s", strings.ToLower(env))) v.AddConfigPath(configDir) v.SetConfigType("yaml") if err := v.ReadInConfig(); err != nil { return nil, fmt.Errorf("failed to read config: %w", err) } if err := v.Unmarshal(&configPtr); err != nil { return nil, fmt.Errorf("failed to unmarshal config: %w", err) } marshal, _ := json.Marshal(configPtr) fmt.Printf("Configuration loading completed: %v\n", string(marshal)) return configPtr, nil } // Env 获取环境 func Env() EnvType { currentEnvOnce.Do(func() { if v, ok := os.LookupEnv(envConfigPrefix + "_ENV"); ok { currentEnv = EnvType(v) } else { currentEnv = EnvDev } }) return currentEnv } // Commit 获取提交ID func Commit() string { currentCommitOnce.Do(func() { if v, ok := os.LookupEnv(envConfigPrefix + "_COMMIT"); ok { currentCommit = v } else { currentCommit = "unknown" } }) return currentCommit }