viper 获取值
支持获取嵌套类型的值
提取子树:
demo案例
main.go
package main
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
type Config struct {
Port int `mapstructure:"port"`
Version string `mapstructure:"version"`
Mysqlconfig `mapstructure:"mysql"`
}
type Mysqlconfig struct {
Host string `mapstructure:"host"`
Port int `mapstructure:"port"`
Dbname string `mapstructure:"dbname"`
}
func main() {
//设置默认值
viper.SetDefault("filedir", "./")
//读取配置文件的名称
viper.SetConfigName("config") //配置文件名称
viper.SetConfigType("yaml") //设置配置文件的扩展名为yaml
//查找文件的路径,以次查找配置项
viper.AddConfigPath("/etc/appname/")
viper.AddConfigPath("$HOME/.appname")
viper.AddConfigPath(".")
//读取配置文件
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("error config file: %s", err))
}
//实时监控配置文件的变化
viper.WatchConfig()
//配置变化的回调函数
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
})
var C Config
err = viper.Unmarshal(&C) //反序列化
if err != nil {
panic(err)
}
fmt.Println("Config:", C)
//r := gin.Default()
//r.GET("/version", func(c *gin.Context) {
// c.String(http.StatusOK, viper.GetString("version")) //获取,如果获取不到,会返回零值
// // 热加载特别牛,动态运行的时候配置文件更改的时候,会自动更新新的配置
//})
//r.Run()
}
config.yaml
port: 8081
version: "v0.1.2"
mysql:
host: "127.0.0.1"
port: 3306
dbname: "sql_demo"
最后解析序列化