viper
viper 是一个完整的Go应用程序配置解决方案。它被设计为在应用程序中工作,可以处理所有类型的配置需求和格式。它支持:
- 支持JSON, TOML, YAML, HCL, envfile,以及java等丰富的配置文件
- 实时查看和重新读取配置文件(可选)
- 从远程配置系统(etcd或Consul)读取数据,并观察更改
- 从命令行标志读取
完成目录如下
.
├── config
│ ├── app.go //
│ └── config.go //配置文件
├── go.mod
├── go.sum
├── main.go
└── pkg
└── config
└── config.go
使用
在你的项目目录下执行go mod init
go get github.com/spf13/viper
新建pkg/config
并创建config.go
文件
/**
@author:panliang
@data:2021/5/13
@note
**/
package config
import (
"github.com/spf13/cast"
"github.com/spf13/viper"
"log"
)
var Viper *viper.Viper
type StrMap map[string]interface{}
func init() {
Viper = viper.New()
// 1. 初始化 Viper 库
Viper = viper.New()
// 2. 设置文件名称
Viper.SetConfigName(".env")
// 3. 配置类型,支持 "json", "toml", "yaml", "yml", "properties",
// "props", "prop", "env", "dotenv"
Viper.SetConfigType("env")
// 4. 环境变量配置文件查找的路径,相对于 main.go
Viper.AddConfigPath(".")
// 5. 开始读根目录下的 .env 文件,读不到会报错
err := Viper.ReadInConfig()
log.Println(err)
// 6. 设置环境变量前缀,用以区分 Go 的系统环境变量
Viper.SetEnvPrefix("appenv")
// 7. Viper.Get() 时,优先读取环境变量
Viper.AutomaticEnv()
}
// Env 读取环境变量,支持默认值
func Env(envName string, defaultValue ...interface{}) interface{} {
if len(defaultValue) > 0 {
return Get(envName, defaultValue[0])
}
return Get(envName)
}
// Add 新增配置项
func Add(name string, configuration map[string]interface{}) {
Viper.Set(name, configuration)
}
// Get 获取配置项,允许使用点式获取,如:app.name
func Get(path string, defaultValue ...interface{}) interface{} {
// 不存在的情况
if !Viper.IsSet(path) {
if len(defaultValue) > 0 {
return defaultValue[0]
}
return nil
}
return Viper.Get(path)
}
// GetString 获取 String 类型的配置信息
func GetString(path string, defaultValue ...interface{}) string {
return cast.ToString(Get(path, defaultValue...))
}
// GetInt 获取 Int 类型的配置信息
func GetInt(path string, defaultValue ...interface{}) int {
return cast.ToInt(Get(path, defaultValue...))
}
// GetInt64 获取 Int64 类型的配置信息
func GetInt64(path string, defaultValue ...interface{}) int64 {
return cast.ToInt64(Get(path, defaultValue...))
}
// GetUint 获取 Uint 类型的配置信息
func GetUint(path string, defaultValue ...interface{}) uint {
return cast.ToUint(Get(path, defaultValue...))
}
// GetBool 获取 Bool 类型的配置信息
func GetBool(path string, defaultValue ...interface{}) bool {
return cast.ToBool(Get(path, defaultValue...))
}
创建config
目录以及app.go
/**
@author:panliang
@data:2021/5/13
@note
**/
package config
import "gotime/pkg/config"
func init() {
config.Add("app", config.StrMap{
// 应用名称,暂时没有使用到
"name": config.Env("APP_NAME", "test"),
// 当前环境,用以区分多环境
"env": config.Env("APP_ENV", "production"),
})
}
自动读取config目录下配置创建config.go
/**
@author:panliang
@data:2021/5/13
@note
**/
package config
func Initialize() {
// 触发加载本目录下其他文件中的 init 方法
}
新建main.go
/**
@author:panliang
@data:2021/5/13
@note
**/
package main
import (
"fmt"
"gotime/config"
config2 "gotime/pkg/config"
)
func init() {
//初始化加载
config.Initialize()
}
func main() {
//打印
fmt.Println(config2.Get("app.name"))
}
新建配置.env
APP_NAME=tests
APP_ENV=local
执行
go run main.go
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。