使用viper读取配置文件
August 13, 2023
viper是一款使用go语言开发的配置文件读取库,支持多种配置文件格式,包括yaml、json、toml等。viper还支持从环境变量读取配置,从远程配置中心读取配置。 本文仅介绍viper读取本地配置文件的使用方法。
安装viper #
go get https://github.com/spf13/viper
读取本地yaml文件 #
在当前项目目录下新建yaml文件config.yaml,内容如下:
version: "0.0.1"
databases:
-
name: "db0"
host: "localhost"
port: 3306
user: "root"
pwd: "123456"
dbname: "user"
-
name: "db1"
host: "localhost"
port: 3307
user: "root"
pwd: "123456"
dbname: "user"
在上面,我们定义了一个version字段,和一个databasess数组,数组中包含两个元素,每个元素都是一个map,包含了数据库的配置信息。
接下来,我们使用viper读取这个配置文件:
package viperdemo
import (
"github.com/spf13/viper"
"os"
"testing"
)
// DatabaseCofig 数据库配置
type DatabaseConfig struct {
Name string `mapstructure:"name"`
Host string `mapstructure:"host"`
Port int `mapstructure:"port"`
Username string `mapstructure:"user"`
Password string `mapstructure:"pwd"`
Database string `mapstructure:"dbname"`
}
func TestReadDemo1(t *testing.T) {
// 设置配置文件 名称
viper.SetConfigName("config.yaml")
// 设置配置文件类型
viper.SetConfigType("yaml")
// 添加配置文件路径
viper.AddConfigPath("./")
// 读取配置文件
if err := viper.ReadInConfig(); err != nil {
t.Fatal(err)
return
}
// 读取 version 字段
t.Log(viper.Get("version"))
var databases []DatabaseConfig
// 解析数据库配置
if err := viper.UnmarshalKey("databases", &databases); err != nil {
t.Fatal(err)
return
}
for _, item := range databases {
t.Log(item)
}
}
在上面的代码中,我们将数据库配置解析到了一个切片中,切片中的每个元素都是一个DatabaseConfig对象。
运行之后,输入如下:

根据环境读取本地yaml文件 #
我们可能会面临这样一个场景:在开发/测试/生产环境中读取不同的配置文件。这时候,我们可以读取环境变量来判断 是什么环境,然后读取不同的配置文件。下面给示例: 首先,定义两个配置文件dev_env.yaml、test_env.yaml,内容分别为:
version: "dev_0.0.1"
version: "test_0.0.1"
接下来,我们使用viper读取这两个配置文件:
func TestReadDemo2(t *testing.T) {
// 设置环境变量为dev
if err := os.Setenv("ENV_VIPER", "test"); err != nil {
t.Fatal(err)
return
}
viperEnv := os.Getenv("ENV_VIPER")
viper.SetConfigName(viperEnv + "_env.yaml")
viper.SetConfigType("yaml")
viper.AddConfigPath("./")
// 环境变量前缀,配置文件中的变量名为:$ENV_VIPER_config.yaml
if err := viper.ReadInConfig(); err != nil {
t.Fatal(err)
return
}
t.Log(viper.Get("version"))
}
运行之后,输入如下:
