更多补充: https://www.liwenzhou.com/posts/Go/viper_tutorial/

1 简介

  • 读取 json,toml,ini,yaml,hcl,env 等格式的文件内容
  • 读取远程配置文件,如 consul,etcd 等和监控配置文件变化
  • 读取命令行 flag 的值
  • 从 buffer 中读取值
  • 读取 环境变量

    2 将配置文件映射为struct

    (1) xxx.yaml

    ```yaml name: “go-web”

mysql: host: 127.0.0.1 port: 8021

  1. <a name="agadS"></a>
  2. ## (2) main.go
  3. ```go
  4. package main
  5. import (
  6. "fmt"
  7. "github.com/fsnotify/fsnotify"
  8. "github.com/spf13/viper"
  9. )
  10. type MySqlConfig struct {
  11. Host string `mapstructure:"host"`
  12. Port int `mapstructure:"port"`
  13. }
  14. type ServerConfig struct {
  15. ServiceName string `mapstructure:"name"`
  16. MysqlInfo MySqlConfig `mapstructure:"mysql"`
  17. }
  18. func main() {
  19. v := viper.New()
  20. v.SetConfigFile("./xxx.yaml")
  21. if err := v.ReadInConfig(); err != nil {
  22. panic(err)
  23. }
  24. serverConfig := ServerConfig{}
  25. if err := v.Unmarshal(&serverConfig); err != nil {
  26. panic(err)
  27. }
  28. fmt.Println(serverConfig) // {go-web 8021}
  29. // 监视配置文件变化
  30. v.WatchConfig()
  31. v.OnConfigChange(func(e fsnotify.Event) {
  32. fmt.Println("config file changed", e.Name)
  33. _ = v.ReadInConfig()
  34. _ = v.Unmarshal(&serverConfig)
  35. })
  36. select {} // 一直阻塞在这儿
  37. }