viper是一个通用的程序配置解析工具包,其功能包括:
- 解析JSON, TOML, YAML 和 HCL配置文件
- 监控配置文件变化
- 解析环境变量
- 解析远程配置系统(etcd 或 Consul),并监控
- 解析命令行flags
- 解析内存配置
由于viper支持多种配置, 因此存在一个解析顺序:
- 通过Set方法的显示设置
- flag参数设置
- 环境变量
- 配置文件
- 键值对存储
- 默认参数
viper.SetDefault("ip", "127.0.0.1")
ip := viper.GetString("ip")
fmt.Println("ip:", ip)
viper 支持JSON, TOML, YAML 和 HCL的文件,注意配置文件必须以小写的扩展名结尾. 同时,可以指定ConfigName, 添加ConfigPath来进行搜索.
// config file
viper.SetConfigName("test") // name of config file (without extension)
viper.AddConfigPath("conf1") // path to look for the config file in
viper.AddConfigPath("conf2") // path to look for the config file in
viper.AddConfigPath("$HOME/") // call multiple times to add many search paths
viper.AddConfigPath(".") // optionally look for config in the working directory
err := viper.ReadInConfig() // Find and read the config file
if err != nil { // Handle errors reading the config file
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
fmt.Println("name:", viper.GetString("name"))
环境变量支持设置前缀. 需要指出环境变量必须在bind之后才能Get.
// env variable
viper.SetEnvPrefix("spf") // will be uppercased automatically
viper.BindEnv("id")
os.Setenv("SPF_ID", "13") // typically done outside of the app
fmt.Println("id:", viper.Get("id"))
pflag是flag的扩展,可参考pflag-example
// work with pflag
pflag.Int("port", 1138, "Port to run Application server on")
viper.BindPFlag("port", pflag.Lookup("port"))
fmt.Println("port:", viper.Get("port"))
// work with io.Reader
viper.SetConfigType("yaml") // or viper.SetConfigType("YAML")
// any approach to require this configuration into your program.
var yamlExample = []byte(`
Hacker: true
name: steve
hobbies:
- skateboarding
- snowboarding
- go
clothing:
jacket: leather
trousers: denim
age: 35
eyes : brown
beard: true
`)
viper.ReadConfig(bytes.NewBuffer(yamlExample))
fmt.Println("age", viper.Get("age"))
// access nested object
fmt.Println("clothing.jacket", viper.Get("clothing.jacket"))
- Get(key string) : interface{}
- GetBool(key string) : bool
- GetFloat64(key string) : float64
- GetInt(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
viper可以将字符串反序列化为对象.
Unmarshal(rawVal interface{}) : error
UnmarshalKey(key string, rawVal interface{}) : error