viper 是一个配置解决方案,拥有丰富的特性:
$ go get github.com/spf13/viper
viper读入配置有如下读入方式:
func AddConfigPath(in string)
添加文件的搜索路径
func AddRemoteProvider(provider, endpoint, path string) error
添加远程源,当前支持etcd、consul、firestore
func AddSecureRemoteProvider(provider, endpoint, path, secretkeyring string) error
添加远程源,当前支持etcd、consul、firestore
func AllKeys() []string
返回所有的键。
func AllSettings() map[string]interface{}
将所有键值对返回
func AllowEmptyEnv(allowEmptyEnv bool)
是否允许空的环境变量视为有效值,默认是false
func AutomaticEnv()
开启环境变量检查是否匹配现有键值,如果匹配则加载。
func BindEnv(input ...string) error
将环境变量的值设置到viper键中,该函数可以提供一或两个参数。
例如:
//假设配置文件中设置了值为192.168.3.244 fmt.Println(viper.GetString("mysql.ip")) // 192.168.3.244 // 绑定环境变量,假设我们设置mysql.ip=127.0.0.1、MYSQL.IP=localhost viper.BindEnv("mysql.ip")//127.0.0.1是调用os.LookupEnv获取的值 fmt.Println(viper.GetString("mysql.ip"))
func BindFlagValue(key string, flag FlagValue) error
将键同flag绑定
func BindFlagValues(flags FlagValueSet) error
绑定flag集合
func BindPFlag(key string, flag *pflag.Flag) error
绑定pflag
func BindPFlags(flags *pflag.FlagSet) error
绑定pflag集合
func ConfigFileUsed() string
返回正在使用的配置文件,例如:
D:\workspace\myOpenSource\go-example\viper\ini\config.ini
func Debug()
打印调试信息,会根据viper查找顺序打印配置信息。例如:
Aliases: map[string]string{} Override: map[string]interface {}{} PFlags: map[string]viper.FlagValue{} Env: map[string][]string{} Key/Value Store: map[string]interface {}{} Config: map[string]interface {}{"mysql.database":"awesome", "mysql.ip":"127.0.0.1", "mysql.password":"123456", "mysql.port":"3306", "mysql.user":"dj", "redis.ip":"127.0.0.1", "redis.port":"7381"} Defaults: map[string]interface {}{}
获取指定key值信息
func Get(key string) interface{} func GetBool(key string) bool func GetDuration(key string) time.Duration func GetFloat64(key string) float64 func GetInt(key string) int func GetInt32(key string) int32 func GetInt64(key string) int64 func GetIntSlice(key string) []int func GetSizeInBytes(key string) uint func GetString(key string) string func GetStringMap(key string) map[string]interface{} func GetStringMapString(key string) map[string]string func GetStringMapStringSlice(key string) map[string][]string func GetStringSlice(key string) []string func GetTime(key string) time.Time func GetUint(key string) uint func GetUint32(key string) uint32 func GetUint64(key string) uint64
func InConfig(key string) bool
判断这个键是否存在。
fmt.Println(viper.InConfig("mysql")) //false fmt.Println(viper.InConfig("ip")) //false fmt.Println(viper.InConfig("mysql.ip")) //true
func IsSet(key string) bool
判断键是否是个集合
func MergeConfig(in io.Reader) error func MergeConfigMap(cfg map[string]interface{}) error func MergeInConfig() error
会将新的配置和原有的配置合并
func OnConfigChange(run func(in fsnotify.Event))
设置配置改变时的回调函数
func ReadConfig(in io.Reader) error
从IO接口中读取配置
func ReadInConfig() error
加载配置文件
func ReadRemoteConfig() error
加载远程配置文件
func RegisterAlias(alias string, key string)
为key设置一个别名。
func Reset()
将存储的所有信息清空,仅用于测试
func SafeWriteConfig() error
仅当文件不存在时,将当前配置写入文件
func SafeWriteConfigAs(filename string) error
将当前配置写入给定文件名(如果它不存在)。
func Set(key string, value interface{})
覆盖内存中的键的值,对键不区分大小写。将用于代替通过flag、配置文件、环境变量、默认值或键/值存储获得的值。
func SetConfigFile(in string)
明确定义配置文件的路径、名称和扩展名。Viper 将使用它而不检查任何配置路径。
func SetConfigName(in string)
设置配置文件的名称。不包括扩展名。
func SetConfigPermissions(perm os.FileMode)
设置给定配置文件的权限
func SetConfigType(in string)
设置配置文件的类型,如json、ini、toml
func SetDefault(key string, value interface{})
为指定的键设置默认值,对key不区分大小写,仅当用户没有通过flag、配置文件以及环境变量设置值时才使用默认值。
func SetEnvKeyReplacer(r *strings.Replacer)
允许你使用一个strings.Replacer对象来将配置名重写为Env名。如果你想在Get()中使用包含-的配置名 ,但希望对应的环境变量名包含_分隔符,就可以使用该方法。使用它的一个例子可以在项目中viper_test.go文件里找到。
func TestSetEnvKeyReplacer(t *testing.T) { Reset() AutomaticEnv() testutil.Setenv(t, "REFRESH_INTERVAL", "30s") replacer := strings.NewReplacer("-", "_") SetEnvKeyReplacer(replacer) assert.Equal(t, "30s", Get("refresh-interval")) }
func SetEnvPrefix(in string)
定义环境变量使用的前缀。
SetEnvPrefix("spf") // 将会自动转为大写 BindEnv("id") os.Setenv("SPF_ID", "13") // 通常通过系统环境变量来设置 id := Get("id") // 13
func SetFs(fs afero.Fs)
设置文件系统。github.com/spf13/afero
func SetTypeByDefaultValue(enable bool)
使用 Get 函数时基于键的默认值而不是基于正常获取逻辑返回的值启用或禁用键值类型的推断。
例如,如果一个键的默认值为 []string{},并且通过环境变量将相同的键设置为“ab c”,则调用 Get 函数将返回该键的字符串切片,如果该键的类型由默认值推断,Get 函数将返回:
[]string {"a", "b", "c"}
否则返回
"a b c"
func Unmarshal(rawVal interface{}, opts ...DecoderConfigOption) error
将配置解组到 Struct。确保正确设置结构字段上的标签。
func UnmarshalExact(rawVal interface{}, opts ...DecoderConfigOption) error
UnmarshalExact 将配置解组为 Struct,如果目标结构中不存在字段,则会出错。
func UnmarshalKey(key string, rawVal interface{}, opts ...DecoderConfigOption) error
UnmarshalKey 采用单个键并将其解组为 Struct。
func WatchConfig()
监控配置
func WatchRemoteConfig() error
func WriteConfig() error
func WriteConfigAs(filename string) error
WriteConfigAs 将当前配置写入给定的文件名。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习