关于如何使用 vpier 读取配置文件绑定到 struct 的疑问

1. 问题描述:

  • 如何将 viper 读取到 yaml 配置文件反序列化绑定到 Config 结构体中
  • 是否建议使用反序列化绑定到结构体的做法,或者是建议使用 Code1.1 直接读取返回的方式更佳
  • 能否指点读取代码优化,Code1.1 中的 ParseConfig 函数的返回值感觉写的不理想
  • 查阅了很多资料,试着使用 viper.Unmarshal() 进行反序列化操作时并没有得到想要的值,且控制台打印空,也无报错
  • 反序列化是否需要使用 tag 绑定结构体如 Code1.2
  • config.yaml 配置文件如 Code1.3

2. Code:

1.1

func main() {
   config, err := tool.ParseConfig("./config/app.yaml")
   if err != nil {
      log.Println(err, "===================")
   }
   fmt.Println(config.GetString("config.AppHost"))    // localhost

}

func ParseConfig(path string) (vipers *viper.Viper, err error) {
    v := viper.New()    // 实例化 viper 对象
    v.SetConfigFile(path)    // 设置配置文件路径
    if err := v.ReadInConfig(); err != nil {    // 读取配置文件
        log.Println("read in config failed", err)
    }
    return v, nil

1.2

type Config struct {
    AppHost string `yaml:"AppHost"`
    AppPort int    `yaml:"AppPort"`
}

1.3

config:
  AppName: Test
  AppHost: localhost
  AppPort: 80
讨论数量: 3
type config struct {
    C app `mapstructure:"config"`
}
type app struct {
    AppName string `mapstructure:"AppName"`
    AppHost string `mapstructure:"AppHost"`
    AppPort int    `mapstructure:"AppPort"`
}

结构体这么写

2年前 评论
Scrooge (楼主) 2年前
func Viper() {
    v := viper.New()
    v.SetConfigFile("./config/config-dev.yaml") // 指定配置文件
    v.AddConfigPath("./config/")                // 指定查找配置文件的路径
    //读取配置信息
    if err := v.ReadInConfig(); err != nil {
        panic(err)
    }
    //监控配置文件变化
    v.WatchConfig()

    v.OnConfigChange(func(in fsnotify.Event) {
        global.Slog.Info("config change ", in.Name)
        if err := v.Unmarshal(&global.Config); err != nil {
            global.Slog.Error(err)
        }
    })

    if err := v.Unmarshal(&global.Config); err != nil {
        global.Slog.Fatal(err)
    }
}

global.Config 是Config 结构体。这个结构体太长了就不贴出来了。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!