gookit/config - Go语言读取多种格式配置文件

351 阅读2分钟

gookit/config - Go应用配置管理,支持读取多种格式 JSON(默认), JSON5, INI, Properties, YAML, TOML, HCL, ENV, Flags,多文件加载,支持数据合并,解析环境变量名等等

功能简介​

  • 支持多种格式: 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: github.com/gookit/conf…

使用示例​

这里使用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"
)


func main() {
    
    config.WithOptions(config.ParseEnv)

    
    config.AddDriver(yamlv3.Driver)

    
    err := config.LoadFiles("testdata/yml_base.yml")
    if err != nil {
        panic(err)
    }

    

    
    err = config.LoadFiles("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) 

更改结构标签名称

config.WithOptions(func(opt *Options) {
    options.DecoderConfig.TagName = "config"
})


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) 


val := config.Bool("debug")
fmt.Print(val) 


name := config.String("name")
fmt.Print(name) 


arr1 := config.Strings("arr1")
fmt.Printf("%v %#v", arr1) 


val := config.StringMap("map1")
fmt.Printf("%v %#v",val) 


value := config.String("shell")
fmt.Print(value) 



value := config.String("arr1.0")
fmt.Print(value) 


value := config.String("map1.key")
fmt.Print(value) 

设置新的值​


config.Set("name", "new name")

name = config.String("name")
fmt.Print(name) 

从ENV载入数据​



config.LoadOSEnvs(map[string]string{"APP_NAME": "app_name", "APP_DEBUG": "app_debug"})


config.Bool("app_debug") 
config.String("app_name") 

从命令行参数载入数据​

支持简单的从命令行 flag 参数解析,加载数据




keys := []string{"name", "env", "age:int" "debug:bool"}
err := config.LoadFlags(keys)


config.String("name") 
config.String("env") 
config.Int("age") 
config.Bool("debug") 

更多​

更多使用说明请看 README