go get github.com/spf13/viper
/*
目录
- main.go
- config.yaml
*/
func main(){
viper.SetConfigName("config") // 设置配置名称
viper.SetConfigFile("config.yaml") // 设置配置文件路径
// 读取配置
if err := viper.ReadInConfig(); err != nil{
log.Fatal(err)
}
// 获取配置数据
summary := viper.GetString("Summary")
fmt.Println(summary)
}
viper 提供默认 Viper对象, 可直接使用。 也通过 New
方法创建自定义Viper
// 直接使用默认对象
viper.GetInt("count")
// 获取全局Viper对象
globalViper := viper.GetViper()
// 新建Viper
conf := viper.New()
conf.SetConfigFile("config.yaml")
从配置读取
viper.SetConfigName("config")
viper.SetConfigFile("config.yaml")
if err := viper.ReadInConfig(); err != nil{
log.Fatal(err)
}
version := viper.GetString("version")
从 io.Reader 读取
func main(){
file, err := os.Open("./config.yaml")
if err != nil{
log.Fatal(err)
}
defer file.Close()
viper.SetConfig("yaml")
version := viper.GetString("version")
// 这里需要设置配置类型, 否则无法正确解释配置内容
// 如果未配置类型,也可以通过 Get 方法获取数据自行解析。
}
从 flag 读取
import (
"fmt"
"github.com/spf13/pflag"
"github.com/spf13/viper"
)
func main() {
pflag.String("ip", "127.0.0.1", "Server running address")
pflag.Int64("port", 8080, "Server running port")
pflag.Parse()
viper.BindPFlags(pflag.CommandLine)
fmt.Printf("ip :%s , port:%s", viper.GetString("ip"), viper.GetString("port"))
}
值得获取方法名为 Get[type] 形式
setDefault
viper.setConfigFile("config.yaml")
viper.SetDefault("port", 8000)
println(viper.GetInt("port") // 8000
// 这里未读取配置文件,将返回默认值
type User struct{
ID string
Name string
nickName string // 小写属性将不做匹配
}
func main(){
/* config.yaml
id: id11
name: Rogan
nickName: "wolf"
*/
...
user := &User{}
viper.Unmarshal(user)
println(&user) // { id11, Rogan }
}
/*
config.yaml
id: 111
name: Rogan
*/
type Conf_1 struct{
Id string
Name string
}
// 将报错
type Conf_2 struct{
Id string
}
/*
config.yaml
server:
port: 8000
host: localhost
*/
type ServerConf struct{
Port int
host string
}
func main(){
...
serverConf := &ServerConf{}
viper.UnmarshalKey("server", serverConfig)
}
func main(){
viper.SetConfigName("config")
viper.SetConfigFile("config.yaml")
viper.ReadInConfig()
log.Println(viper.GetString("Summary"), viper.InConfig("Summary"))
buff := []byte(`Name: jeck`)
viper.MergeConfig(bytes.NewReader(buff))
log.Println(viper.GetString("Name"))
}
func main(){
viper.SetConfigName("config")
viper.SetConfigFile("config.yaml")
viper.ReadInConfig()
viper.WatchConfig()
for {
log.Println(viper.GetString("version"))
time.Sleep(time.Second * 5)
}
}
// 初始 versioni: 1
// --> 1
// 修改config.yaml version: 2
// --> 2