package config import ( "encoding/json" "fmt" "log" "github.com/fsnotify/fsnotify" "github.com/spf13/pflag" "github.com/spf13/viper" ) type Configs struct { Vber vberConfig `yaml:"vber"` Redis RedisConfig `yaml:"redis"` Mysql MysqlConfig `yaml:"mysql"` Logger LoggerConfig `yaml:"log"` } var ( //获取命令行参数 conf = pflag.StringP("config", "c", "", "config filepath") C *Configs ) func init() { pflag.Parse() if err := initConfig(*conf); err != nil { log.Println("Config配置失败:", err.Error()) panic("Config配置失败") } viper.WatchConfig() } func initConfig(name string) error { if name != "" { viper.SetConfigFile(name) } else { // 默认配置文件路径 ./config.yaml viper.AddConfigPath("./") viper.SetConfigName("config") } viper.SetConfigType("yaml") // 读取配置文件 err := viper.ReadInConfig() if err != nil { panic(fmt.Errorf("Fatal error config file: %s \n", err)) } if err = viper.Unmarshal(&C); err != nil { return err } // 打印下配置 marshal, err := json.Marshal(C) if err == nil { fmt.Println("加载配置文件:", string(marshal)) } return nil } func (c *Configs) watch() { viper.WatchConfig() viper.OnConfigChange(func(e fsnotify.Event) { fmt.Println("C file changed:", e.Name) }) }