viper是用来读取的配置的库,viper可以从环境变量,yaml文件,json文件,命令行等读取配置,存到自己的key,value中
话不多说,看示例
go get github.com/spf13/viper
func InitConfig() {
v := viper.New()
v.SetDefault("ContentDir", "content")
fmt.Println(v.GetString("ContentDir"))
}
func main() {
viper.AutomaticEnv() // 读取所有环境变量到viper存储
fmt.Println(viper.GetString("GOPATH"))
}
将 ./…/config-debug.yaml 的内容读取出来,然后解码到 global.NacosConfig
func InitConfig() {
//从配置文件中读取出对应的配置
configFileName := fmt.Sprintf("./../%s-debug.yaml", "config")
v := viper.New()
//文件的路径如何设置
v.SetConfigFile(configFileName)
if err := v.ReadInConfig(); err != nil {
panic(err)
}
//这个对象如何在其他文件中使用 - 全局变量
if err := v.Unmarshal(&global.NacosConfig); err != nil {
panic(err)
}
// 开启实时监控
v.WatchConfig()
// 文件更新的回调函数
v.OnConfigChange(func(in fsnotify.Event) {
fmt.Println("配置改变")
if err := v.Unmarshal(&global.NacosConfig); err != nil {
panic(err)
}
})
// 测试部分
go func() {
for {
time.Sleep(time.Second*1)
fmt.Println(global.NacosConfig)
}
}()
time.Sleep(time.Second * 10000)
}
注意反序列化的时候,结构体一定要加相应的tag
type NacosConfig struct {
Host string `mapstructure:"host"`
Port uint64 `mapstructure:"port"`
Namespace string `mapstructure:"namespace"`
User string `mapstructure:"user"`
Password string `mapstructure:"password"`
DataId string `mapstructure:"dataid"`
Group string `mapstructure:"group"`
}
需要认识到的一件重要事情是,每一个Get方法在找不到值的时候都会返回零值。为了检查给定的键是否存在,提供了IsSet()方法
Get(key string) : interface{}
GetBool(key string) : bool
GetFloat64(key string) : float64
GetInt(key string) : int
GetIntSlice(key string) : []int
GetString(key string) : string
GetStringMap(key string) : map[string]interface{}
GetStringMapString(key string) : map[string]string
GetStringSlice(key string) : []string
GetTime(key string) : time.Time
GetDuration(key string) : time.Duration
IsSet(key string) : bool
AllSettings() : map[string]interface{}
func InitConfig() {
//从配置文件中读取出对应的配置
ok := GetEnvInfo("POWERBANK_DEBUG")
configFileName := fmt.Sprintf("/config/%s-pro.yaml", "config")
if ok {
configFileName = fmt.Sprintf("./%s-debug.yaml", "config")
}
v := viper.New()
//文件的路径如何设置
v.SetConfigFile(configFileName)
if err := v.ReadInConfig(); err != nil {
panic(err)
}
// 开启实时监控
v.WatchConfig()
//这个对象如何在其他文件中使用 - 全局变量
if err := v.Unmarshal(&global.SrvConfig); err != nil {
panic(err)
}
// 文件更新的回调函数
v.OnConfigChange(func(in fsnotify.Event) {
fmt.Println("配置改变")
if err := v.Unmarshal(&global.SrvConfig); err != nil {
panic(err)
}
})
}
func GetEnvInfo(env string) bool {
viper.AutomaticEnv()
return viper.IsSet(env)
}