gookit/config
– Go 利用配置管理,反对读取多种格局 JSON
(默认), JSON5
, INI
, Properties
, YAML
, TOML
, HCL
, ENV
, Flags
,多文件加载,反对数据合并,解析环境变量名等等
<!–truncate–>
性能简介
-
反对多种格局:
JSON
(默认),JSON5
,INI
,Properties
,YAML
,TOML
,HCL
,ENV
,Flags
JSON
内容反对正文,能够设置解析时革除正文- 其余驱动都是按需应用,不应用的不会加载编译到利用中
- 反对多个文件、多数据加载
- 反对从 OS ENV 变量数据加载配置
- 反对从近程 URL 加载配置数据
- 反对从命令行参数 (
flags
) 设置配置数据 -
反对在配置数据更改时触发事件
- 可用事件:
set.value
,set.data
,load.data
,clean.data
- 可用事件:
- 反对数据笼罩合并,加载多份数据时将按 key 主动合并
-
反对将全副或局部配置数据绑定到构造体
config.BindStruct("key", &s)
- NEW: 反对通过构造体标签
default
解析并设置默认值
- NEW: 反对通过构造体标签
- 反对通过
.
分隔符来按门路获取子级值,也反对自定义分隔符。e.gmap.key
arr.2
- 反对解析 ENV 变量名称。like
shell: ${SHELL}
->shell: /bin/zsh
- 简洁的应用 API
Get
Int
Uint
Int64
String
Bool
Ints
IntMap
Strings
StringMap
… - 欠缺的单元测试(code coverage > 95%)
Github: https://github.com/gookit/config
应用示例
这里应用 yaml 格局内容作为示例:
name: app2
debug: false
baseKey: value2
shell: ${SHELL}
envKey1: ${NotExist|defValue}
map1:
key: val2
key2: val20
arr1:
- val1
- val21
示例代码请看 _examples/yaml.go:
package main
import (
"github.com/gookit/config/v2"
"github.com/gookit/config/v2/yamlv3"
)
// go run ./examples/yaml.go
func main() {
// 设置选项反对 ENV 解析
config.WithOptions(config.ParseEnv)
// 增加驱动程序以反对 yaml 内容解析(除了 JSON 是默认反对,其余的则是按需应用)config.AddDriver(yamlv3.Driver)
// 加载配置,能够同时传入多个文件
err := config.LoadFiles("testdata/yml_base.yml")
if err != nil {panic(err)
}
// fmt.Printf("config data: \n %#v\n", config.Data())
// 加载更多文件
err = config.LoadFiles("testdata/yml_other.yml")
// 也能够一次性加载多个文件
// err := config.LoadFiles("testdata/yml_base.yml", "testdata/yml_other.yml")
if err != nil {panic(err)
}
}
应用阐明
- 能够应用
WithOptions()
增加更多额定选项性能. 例如:ParseEnv
,ParseDefault
- 能够应用
AddDriver()
增加须要应用的格局驱动器(json
是默认加载的的, 无需增加) -
而后就能够应用
LoadFiles()
LoadStrings()
等办法加载配置数据- 能够传入多个文件, 也能够调用屡次
- 屡次加载的数据会主动按 key 进行合并解决
绑定数据到构造体
留神:构造体默认的绑定映射 tag 是
mapstructure
,能够通过设置Options.TagName
来更改它
type User struct {
Age int `mapstructure:"age"`
Key string `mapstructure:"key"`
UserName string `mapstructure:"user_name"`
Tags []int `mapstructure:"tags"`}
user := User{}
err = config.BindStruct("user", &user)
fmt.Println(user.UserName) // inhere
更改构造标签名称
config.WithOptions(func(opt *Options) {options.DecoderConfig.TagName = "config"})
// use custom tag name.
type User struct {
Age int `config:"age"`
Key string `config:"key"`
UserName string `config:"user_name"`
Tags []int `config:"tags"`}
user := User{}
err = config.Decode(&user)
将所有配置数据绑定到构造:
config.Decode(&myConf)
// 也能够
config.BindStruct("", &myConf)
config.MapOnExists
与BindStruct
一样,但仅当 key 存在时才进行映射绑定
疾速获取数据
// 获取整型
age := config.Int("age")
fmt.Print(age) // 100
// 获取布尔值
val := config.Bool("debug")
fmt.Print(val) // true
// 获取字符串
name := config.String("name")
fmt.Print(name) // inhere
// 获取字符串数组
arr1 := config.Strings("arr1")
fmt.Printf("%v %#v", arr1) // []string{"val1", "val21"}
// 获取字符串 KV 映射
val := config.StringMap("map1")
fmt.Printf("%v %#v",val) // map[string]string{"key":"val2", "key2":"val20"}
// 值蕴含 ENV 变量
value := config.String("shell")
fmt.Print(value) // /bin/zsh
// 通过 key 门路获取值
// from array
value := config.String("arr1.0")
fmt.Print(value) // "val1"
// from map
value := config.String("map1.key")
fmt.Print(value) // "val2"
设置新的值
// set value
config.Set("name", "new name")
// get
name = config.String("name")
fmt.Print(name) // new name
从 ENV 载入数据
// os env: APP_NAME=config APP_DEBUG=true
// load ENV info
config.LoadOSEnvs(map[string]string{"APP_NAME": "app_name", "APP_DEBUG": "app_debug"})
// read
config.Bool("app_debug") // true
config.String("app_name") // "config"
从命令行参数载入数据
反对简略的从命令行 flag
参数解析,加载数据
// flags like: --name inhere --env dev --age 99 --debug
// load flag info
keys := []string{"name", "env", "age:int" "debug:bool"}
err := config.LoadFlags(keys)
// read
config.String("name") // "inhere"
config.String("env") // "dev"
config.Int("age") // 99
config.Bool("debug") // true
更多
更多应用阐明请看 README