go配置读取之viper库

韶英达
2023-12-01

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"`
}

获取key的值

需要认识到的一件重要事情是,每一个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)
}
 类似资料: