一: github 介绍
Viper 是一个完整的 Go 应用程序配置解决方案,包括12-Factor 应用程序。它被设计为在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持:
https://github.com/spf13/viper
设置默认值
从 JSON、TOML、YAML、HCL、envfile 和 Java 属性配置文件中读取
实时观看和重新读取配置文件(可选)
从环境变量读取
从远程配置系统(etcd 或 Consul)读取,并观察更改
从命令行标志读取
从缓冲区读取
设置显式值
Viper 可以被认为是满足所有应用程序配置需求的注册表。
重要:Viper 配置键不区分大小写。 目前正在讨论将其设为可选。
二: 安装和使用
go get github.com/spf13/viper
# 设置默认值
func SetDefault(key string, value interface{})
# 配置文件名(不需要扩展名)
func SetConfigName(in string)
# 配置类型
func SetConfigType(in string)
# 添加配置文件路径
func AddConfigPath(in string)
# 读取配置
func ReadInConfig() error
# 配置文件未找到错误
viper.ConfigFileNotFoundError
# 获取值
Get(key string) : interface{} //需要断言,一般不使用
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]interface{}
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]interface{}
# key 使用点表示嵌套结构:
GetString("datastore.metric.host")
三: 具体使用
1. 创建 config.yaml
app:
addr: :9999
2. 配置加载
在tool/config.go
或者自己的项目路径的合适位置中加载配置
package tool
import (
"github.com/spf13/viper"
"log"
)
// LoadConfig 加载配置
func LoadConfig() {
// 定义默认值:配置文件加载错误使用的值
setConfigDefault()
// 配置文件属性设置
viper.SetConfigName("config") // 后缀可以不需要写,自动识别
//viper.SetConfigType("yaml") // 不需要写,自动识别
viper.AddConfigPath(".") // 由于配置加载是在main.go里的,所以路径是相对main.go
// 读取配置
if err := viper.ReadInConfig(); err != nil {
// 如果需要对配置文件不存在错误,做特殊处理,使用:
//if _, ok := err.(viper.ConfigFileNotFoundError); ok {
// config file not found; ignore error if desired
//}else{
// config file was found but another error was produced
//}
log.Fatal(err)
}
}
// setConfigDefault 设置默认值
func setConfigDefault() {
// 设置默认值是因为如果配置文件加载失败
// app.addr
viper.SetDefault("add.addr", ":8080")
}
3. 使用时机
项目启动的时候加载
// main
func main() {
// 完成配置加载
tool.LoadConfig()
// 初始化Gin引擎
router := gin.Default()
// 设置路由
app.SetRouter(router)
// 启动监听
router.Run(viper.GetString("app.addr"))
}
评论区