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 解析并设置默认值
  • 反对通过 . 分隔符来按门路获取子级值,也反对自定义分隔符。 e.g map.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: app2debug: falsebaseKey: value2shell: ${SHELL}envKey1: ${NotExist|defValue}map1:    key: val2    key2: val20arr1:    - val1    - val21
示例代码请看 _examples/yaml.go:
package mainimport (    "github.com/gookit/config/v2"    "github.com/gookit/config/v2/yamlv3")// go run ./examples/yaml.gofunc 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.MapOnExistsBindStruct 一样,但仅当 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 arrayvalue := config.String("arr1.0")fmt.Print(value) // "val1"// from mapvalue := config.String("map1.key")fmt.Print(value) // "val2"

设置新的值

// set valueconfig.Set("name", "new name")// getname = config.String("name")fmt.Print(name) // new name

从ENV载入数据

// os env: APP_NAME=config APP_DEBUG=true// load ENV infoconfig.LoadOSEnvs(map[string]string{"APP_NAME": "app_name", "APP_DEBUG": "app_debug"})// readconfig.Bool("app_debug") // trueconfig.String("app_name") // "config"

从命令行参数载入数据

反对简略的从命令行 flag 参数解析,加载数据

// flags like: --name inhere --env dev --age 99 --debug// load flag infokeys := []string{"name", "env", "age:int" "debug:bool"}err := config.LoadFlags(keys)// readconfig.String("name") // "inhere"config.String("env") // "dev"config.Int("age") // 99config.Bool("debug") // true

更多

更多应用阐明请看 README