golang下的viper包的简单使用方式
作者:imthefaker
这篇文章主要介绍了golang下的viper包的简单使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
golang下viper包的简单使用
Viper 是一个完整的 Go 应用程序配置解决方案,它旨在在应用程序中工作,并且可以处理所有类型的配置需求和格式
使用viper并不复杂,在不生成实例的情况下,viper使用默认的实例才缓存配置信息,如果你不想这么做,可以使用viper.New()方法来生成自己的实例,直接上代码
package main import ( "bytes" "fmt" "github.com/spf13/viper" ) func main() { viper.SetDefault("ContentDir", "content") viper.SetDefault("LayoutDir", "layouts") viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"}) /** viper.SetDefault会设置默认参数,也就是说,每次读取文件后,这些参数都会读取到viper的缓存中, 并且在使用viper提供的方法写文件时,也会一同写进去,当使用Set方法后,默认值将会被覆盖 **/ viper.SetConfigName("config") // 这里设置要读取文件的名称 viper.SetConfigType("yaml") // 这里设置要读取文件的类型 viper.AddConfigPath(".") // 这里设置读取文件的文件夹路径,可以设置多个路径,将会依次从这几个路径中去寻找config.yaml文件 viper.AddConfigPath("./test3") // 设置的第二个备选路径 viper.AddConfigPath("./test") // 设置的最后一个备选路径 err := viper.ReadInConfig() // ReadInConfig用于读取查找到的配置文件 if err != nil { panic(fmt.Errorf("fatal error config file: %w", err)) // 返回失败信息,可能由于文件不存在等 } viper.Set("newconf", true) // 设置新参数,上面讲述了Set和SetDefault的区别,这里不再赘述 viper.WriteConfig() viper.SafeWriteConfig() viper.WriteConfigAs("./test2/config.yaml") viper.SafeWriteConfigAs("./test2/config.yaml") /** WriteConfig用于将配置信息写入新的配置文件中,新文件的名称和后缀采用使用第20,21行所设置的SetConfigName("config") 和viper.SetConfigType("yaml")。WriteConfigAs可以指定新的配置文件的路径(带有文件名的路径), 而WriteConfig则写入你所定义的第一个AddConfigPath,即第22行:“ viper.AddConfigPath(".") ” 方法名带有Safe的则代表如果文件已经存在,则会报错。不带有Safe的方法在文件已经存在时会覆盖文件。 这里将会把第11,12,13行和第31行设置的参数连同config.yaml文件原本的参数一同写入到新文件中 **/ var yamlExample = []byte(` Hacker: true name: steve hobbies: - skateboarding - snowboarding - go clothing: jacket: leather trousers: denim age: 35 eyes : brown beard: true `) viper.SetConfigType("yaml") viper.ReadConfig(bytes.NewBuffer(yamlExample)) x := viper.GetString("name") y := viper.Get("name") fmt.Println(x) fmt.Println(y) /** 除了从文件中读取配置信息以外,也可以从字节流中读取,如上所示,GetString方法返回key所对应的字符串类型的value, 同样你也可以使用GetInt,GetBool等等,Get方法返回一个接口,因此它可以适用于所有的类型。 **/ viper.RegisterAlias("loud", "Verbose") viper.Set("verbose", true) viper.Set("loud", true) viper.GetBool("loud") viper.GetBool("verbose") /** RegisterAlias用于注册别名,也就意味着你接下来的所有关于loud的操作都可以用vervose来代替, 但他只作为你程序运行过程中一个方便使用的别名,其所表达的配置信息中不含有verbose这一属性, 也就是说最终你写入新配置文件时,verbose将不会出现 最后注意!!!:在vaper中,配置信息的key是不区分大小写的,因此上方的Verbose和verbose等同 **/ viper.AutomaticEnv() // 读取环境变量 viper.SetEnvPrefix("CGO") /** 设置环境变量前缀:CGO_,如果是cgo,将自动转变为大写。 这样在使用get读取环境变量时可以只读取与项目有关的配置 **/ viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_")) // 将viper.Get(key) key字符串中'.'和'-'替换为'_', // 这使得使用Get获取值的时候可以使用其他符号来代替_ viper.BindEnv("ENABLED") // 将"CGO_ENABLED"绑定到"ENABLED" viper.BindEnv("enabled") // 匹配环境变量时自动转换为大写,但key仍然是小写 viper.BindEnv("user.secret-id", "GOROOT") // 当含有两个参数时,前缀不会生效 viper.BindEnv("PATH", "PATH") fmt.Println(viper.Get("user.secret-id")) fmt.Println(viper.GetString("ENABLED")) fmt.Println(viper.GetString("enabled")) fmt.Println(viper.GetString("PATH")) // viper在读取环境变量时是区分大小写的 }
golang常用库viper解读
1. viper的介绍
viper是go一个配置解决方案的库。
- 支持各种配置文件,如JSON,TOML, YAML, HCL, envfile和Java属性配置文件
- 支持监听文件变化以及重新读取配置
- 支持从环境变量读取配置
- 支持从远程配置系统(etcd或Consul)读取配置,并能监听远程配置修改
- 支持从命令行标志Flag读取配置,比如搭配cobra使用
viepr直接使用go get命令安装即可
$ go get github.com/spf13/viper
2.viper的使用
//加载本地配置 func InitInFromLocal() (*viper.Viper, error) { home := "./config" var v = viper.New() //cobra.CheckErr(err) fmt.Printf("UserHomeDir", home) // Search config in home directory with name ".cobra" (without extension). v.AddConfigPath(home) v.SetConfigType("toml") v.SetConfigName("pro") v.AutomaticEnv() if err := v.ReadInConfig(); err == nil { fmt.Println("Using config file success:", v.ConfigFileUsed()) } else { fmt.Println("Using config file:%s", err) } fmt.Println(v.GetString("app_name_pro")) return v, nil } //加载远端配置 func InitConfigFromRemote() error { // 远程配置 viper.AddRemoteProvider("etcd", "http://127.0.0.1:2379", "config/app.yml") //v.SetConfigType("json") viper.SetConfigFile("app.yml") viper.SetConfigType("yml") if err := viper.ReadRemoteConfig(); err == nil { log.Printf("use config file -> %s\n", viper.ConfigFileUsed()) } else { return err } return nil } //设置默认值 viper.SetDefault("email", "NAME HERE <EMAIL ADDRESS>") viper.SetDefault("license", "apache") //绑定单个值cobra viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author")) viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper")) //绑定多个值 viper.BindPFlags(rootCmd.PersistentFlags()) //获取环境变量 v.AutomaticEnv() v.AllowEmptyEnv(true) v.SetEnvPrefix("CK") //监听文件变化 // 监听到文件变化后的回调 v.OnConfigChange(func(e fsnotify.Event) { fmt.Println("Config file changed:", e.Name) fmt.Println(v.Get("db.redis.passwd")) }) v.WatchConfig() //从viper写入文件 viper.SetConfigFile("./hello.yml") viper.WriteConfig() //获取子配置项 viper.Sub("db")
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。