1. 介绍
Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性:
- 设置默认值
- 从
JSON
、TOML
、YAML
、HCL
、envfile
和Java properties
格式的配置文件读取配置信息 - 实时监控和重新读取配置文件(可选)
- 从环境变量中读取
- 从远程配置系统(etcd或Consul)读取并监控配置变化
- 从命令行参数读取配置
- 从buffer读取配置
- 显式配置值
2. yaml教程
3. 安装
go get github.com/spf13/viper
4. 将配置文件映射成struct
package main
import (
"fmt"
"github.com/spf13/viper"
)
type ServerConfig struct{
ServiceName string `mapstructure:"name"`
Port int `mapstructure:"port"`
}
func main(){
v := viper.New()
//文件的路径如何设置
v.SetConfigFile("viper_test/ch01/config.yaml")
if err := v.ReadInConfig(); err != nil{
panic(err)
}
serverConfig := ServerConfig{}
if err := v.Unmarshal(&serverConfig); err != nil{
panic(err)
}
fmt.Println(serverConfig)
fmt.Printf("%V", v.Get("name"))
}
配置文件config.yaml
name: 'user-web'
port: 8021
5. 使用
package main
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
"time"
)
type MysqlConfig struct {
Host string `mapstructure:"host"`
Port int `mapstructure:"port"`
}
type ServerConfig struct{
Name string `mapstructure:"name"`
MysqlInfo MysqlConfig `mapstructure:"mysql"`
}
func GetEnvInfo(env string) string {
viper.AutomaticEnv()
return viper.GetString(env)
}
func main(){
data := GetEnvInfo("Debug")
var configFileName string
configFileNamePrefix := "config"
if data == "true" {
configFileName = fmt.Sprintf("viper_test/%s-debug.yaml", configFileNamePrefix)
}else{
configFileName = fmt.Sprintf("viper_test/%s-pro.yaml", configFileNamePrefix)
}
serverConfig := ServerConfig{}
fmt.Println(data)
v := viper.New()
v.SetConfigFile(configFileName)
err := v.ReadInConfig()
if err != nil {
panic(err)
}
if err := v.Unmarshal(&serverConfig); err != nil {
panic(err)
}
fmt.Println(serverConfig)
go func() {
v.WatchConfig()
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
_ = v.ReadInConfig() // 读取配置数据
_ = v.Unmarshal(&serverConfig)
fmt.Println(serverConfig)
})
}()
time.Sleep(time.Second*3000)
}
配置文件内容
name: 'user-web'
mysql:
host: '127.0.0.1'
port: 3306
手机号码正则表达式
^1([38][0-9]|14[579]|5[^4]|16[6]|7[1-35-8]|9[189])\d{8}$