package config import ( "fmt" "github.com/spf13/viper" ) type Config struct { AppEnv string AppPort string RedisAddr string MySQLDSN string PostgresDSN string MongoDSN string } // 需先执行LoadConfig后才能读取APP_ENV var APP_ENV string // LoadConfig 读取配置文件和环境变量 func LoadConfig() (*Config, error) { v := viper.New() // 默认值(避免缺省时崩溃) v.SetDefault("APP_ENV", "dev") v.SetDefault("APP_PORT", "8080") v.SetDefault("REDIS_ADDR", "localhost:6379") v.SetDefault("MYSQL_DSN", "") v.SetDefault("POSTGRES_DSN", "host=localhost user=fwh_toolbox password=fwh_toolbox dbname=fwh_toolbox_db port=5432 sslmode=disable") v.SetDefault("MONGO_DSN", "mongodb://localhost:27017/FwhToolboxDbDev") // 多文件路径支持 paths := []string{"./.env", "./config.env"} var readErr error for _, path := range paths { v.SetConfigFile(path) if err := v.ReadInConfig(); err == nil { fmt.Printf("✅ Using config file: %s\n", path) readErr = nil break } else { readErr = err } } // 环境变量覆盖文件配置 v.AutomaticEnv() // 如果两个文件都没读到,也没关系,直接用默认值 if readErr != nil { fmt.Println("⚠️ No config file found, using default values & environment variables") } APP_ENV = v.GetString("APP_ENV") return &Config{ AppEnv: v.GetString("APP_ENV"), AppPort: v.GetString("APP_PORT"), RedisAddr: v.GetString("REDIS_ADDR"), MySQLDSN: v.GetString("MYSQL_DSN"), PostgresDSN: v.GetString("POSTGRES_DSN"), MongoDSN: v.GetString("MONGO_DSN"), }, nil }