项目地址

https://github.com/spf13/viper

设置键值

设置值

viper.Set("key", "value")
viper.Set("keys", map[string]string{"key1": "value1", "key2": "value2"})

设置默认值

viper.SetDefault("key", "value")
viper.SetDefault("keys", map[string]string{"key1": "value1", "key2": "value2"})

使用别名

设置后对valuelueva进行赋值和取值的结果是相同的。

viper.RegisterAlias("value", "lueva")

读取键值

读取单个键值

viper.GetString("key")
viper.GetBool("key")
viper.GetInt("key")

读取嵌套键值

如果存在键为key.subkey.subsubkey,那么优先读取这个键,而不是路径。

viper.GetString("key.subkey.subsubkey")

读取数组

读取数组第一个值。

viper.GetString("key.subkey.0")

方法列表

方法列表
Get(key string) : any
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]any
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]any

读取配置文件

设置路径

viper.AddConfigPath(".")

设置文件名

viper.SetConfigName("config")

设置文件后缀

viper.SetConfigType("json")

导入配置

err := viper.ReadInConfig()

保存配置文件

预定义路径

覆盖当前配置文件

将当前viper配置写入预定义的文件路径。如果预定义文件路径存在,则覆盖该文件;如果预定义文件路径不存在,则产生一个error

viper.WriteConfig()

创建新的文件

当前viper配置写入预定义的文件路径。如果预定义文件路径存在,则产生一个error;如果预定义文件路径不存在,则会创建文件并写入。

viper.SafeWriteConfig()

指定路径

覆盖当前配置文件

将当前viper配置写入给定的文件路径。如果给定文件路径存在,则覆盖该文件;如果给定文件路径不存在,则会产生一个error

viper.WriteConfigAs("./config")

创建新的文件

将当前viper配置写入给定的文件路径。如果给定文件路径存在,则产生一个error;如果给定文件路径不存在,则会创建文件并写入。

viper.SafeWriteConfigAs("./config")

获取子配置

如果key对应的value包含新的键值对,则可以将其提取出来作为子配置。

subViper := viper.Sub("key")

解码到结构体

type config struct {
	Port int
	Name string
	PathMap string `mapstructure:"path_map"`
}
 
var C config
 
err := viper.Unmarshal(&C)
if err != nil {
	t.Fatalf("unable to decode into struct, %v", err)
}

多个Viper实例

x := viper.New()
y := viper.New()

使用环境变量

为所有的key都加上一个前缀,不分大小写。

func main() {
	viper.SetEnvPrefix("per")
	_ = viper.BindEnv("id")
	_ = os.Setenv("PER_ID", "13")
	fmt.Println("id:", viper.Get("id"))
}

使用flag

serverCmd.Flags().Int("port", 1138, "Port to run Application server on")
viper.BindPFlag("port", serverCmd.Flags().Lookup("port"))
pflag.Int("flagname", 1234, "help message for flagname")
pflag.Parse()
viper.BindPFlags(pflag.CommandLine)
i := viper.GetInt("flagname")