2025年3月25日 星期二 甲辰(龙)年 月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Go语言

gookit/config 简洁 / 功能完善的 Golang 应用程序配置管理工具库

时间:12-14来源:作者:点击数:5

功能简介

  • 支持多种格式: JSON(默认), JSON5INIYAMLTOMLHCLENVFlags
    • JSON 内容支持注释,可以设置解析时清除注释
    • 其他驱动都是按需使用,不使用的不会加载编译到应用中
  • 支持多个文件、多数据加载
  • 支持从 OS ENV 变量数据加载配置
  • 支持从远程 URL 加载配置数据
  • 支持从命令行参数(flags)设置配置数据
  • 支持数据覆盖合并,加载多份数据时将按key自动合并
  • 支持将全部或部分配置数据绑定到结构体 config.BindStruct("key", &s)
  • 支持通过 . 分隔符来按路径获取子级值,也支持自定义分隔符。 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%)

提供一个子包 dotenv,支持从文件(eg .env)中导入数据到ENV

只使用 INI

如果你仅仅想用INI来做简单配置管理,推荐使用 gookit/ini

快速使用

这里使用yaml格式作为示例(testdata/yml_other.yml):

  • 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/yaml"
  • )
  • // go run ./examples/yaml.go
  • func main() {
  • // 设置选项支持 ENV 解析
  • config.WithOptions(config.ParseEnv)
  • // 添加驱动程序以支持yaml内容解析(除了JSON是默认支持,其他的则是按需使用)
  • config.AddDriver(yaml.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")
  • // can also load multi at once
  • // err := config.LoadFiles("testdata/yml_base.yml", "testdata/yml_other.yml")
  • if err != nil {
  • panic(err)
  • }
  • }

绑定数据到结构体

注意:结构体默认的绑定映射tag是 mapstructure,可以通过设置 Options.TagName 来更改它

  • user := struct {
  • Age int
  • Kye string
  • UserName string `mapstructure:"user_name"`
  • Tags []int
  • }{}
  • err = config.BindStruct("user", &user)
  • fmt.Println(user.UserName) // inhere

更改结构标签名称

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

可以使用空字符串将所有配置数据绑定到结构:

  • config.BindStruct("", &myConf)

快速获取数据

  • // 获取整型
  • 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.LoadOSEnv([]string{"APP_NAME", "APP_NAME"}, true)
  • // 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

创建自定义实例

您可以创建自定义配置实例:

  • // create new instance, will auto register JSON driver
  • myConf := config.New("my-conf")
  • // create empty instance
  • myConf := config.NewEmpty("my-conf")
  • // create and with some options
  • myConf := config.NewWithOptions("my-conf", config.ParseEnv, config.ReadOnly)

可用选项

  • // Options config options
  • type Options struct {
  • // parse env value. like: "${EnvName}" "${EnvName|default}"
  • ParseEnv bool
  • // config is readonly. default is False
  • Readonly bool
  • // enable config data cache. default is False
  • EnableCache bool
  • // parse key, allow find value by key path. default is True eg: 'key.sub' will find `map[key]sub`
  • ParseKey bool
  • // tag name for binding data to struct
  • TagName string
  • // the delimiter char for split key, when `FindByPath=true`. default is '.'
  • Delimiter byte
  • // default write format. default is JSON
  • DumpFormat string
  • // default input format. default is JSON
  • ReadFormat string
  • }

API方法参考

载入配置

  • LoadOSEnv(keys []string) 从ENV载入数据
  • LoadData(dataSource ...interface{}) (err error) 从struct或map加载数据
  • LoadFlags(keys []string) (err error) 从命令行参数载入数据
  • LoadExists(sourceFiles ...string) (err error) 从存在的配置文件里加载数据,会忽略不存在的文件
  • LoadFiles(sourceFiles ...string) (err error) 从给定的配置文件里加载数据,有文件不存在则会panic
  • LoadRemote(format, url string) (err error) 从远程 URL 加载配置数据
  • LoadSources(format string, src []byte, more ...[]byte) (err error) 从给定格式的字节数据加载配置
  • LoadStrings(format string, str string, more ...string) (err error) 从给定格式的字符串配置里加载配置数据

获取值

  • Bool(key string, defVal ...bool) bool
  • Int(key string, defVal ...int) int
  • Uint(key string, defVal ...uint) uint
  • Int64(key string, defVal ...int64) int64
  • Ints(key string) (arr []int)
  • IntMap(key string) (mp map[string]int)
  • Float(key string, defVal ...float64) float64
  • String(key string, defVal ...string) string
  • Strings(key string) (arr []string)
  • StringMap(key string) (mp map[string]string)
  • Get(key string, findByPath ...bool) (value interface{})

设置值

  • Set(key string, val interface{}, setByPath ...bool) (err error)

有用的方法

  • Getenv(name string, defVal ...string) (val string)
  • AddDriver(driver Driver)
  • Data() map[string]interface{}
  • Exists(key string, findByPath ...bool) bool
  • DumpTo(out io.Writer, format string) (n int64, err error)
  • SetData(data map[string]interface{}) 设置数据以覆盖 Config.Data
  • BindStruct(key string, dst interface{}) error

相关包

github 地址:https://github.com/gookit/config

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐