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

LogicAetherMaster
• 阅读 1295

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: 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.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 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

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
10个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
4年前
VSCode配置FiraCode和更纱黑体字体
!(https://oscimg.oschina.net/oscnet/c7bb62d935ceb01d3b7fe176322e84ae00d.png)Fira Code下载到FiraCode字体的GitHub(https://www.oschina.net/action/GoToLink?urlhttps%
Stella981 Stella981
4年前
PhoneGap设置Icon
参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
Linux自动检测网站心跳通知shell脚本
!/bin/bashLIST("http://xxxx.com")NAME("评价系统getwindowList接口")for((i0;i<${LIST@};i))doHTTP_CODEcurlo/dev/nullsw"%{http_code}""${LIST
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
LogicAetherMaster
LogicAetherMaster
Lv1
乡梦不曾休,惹甚闲愁?忠州过了又涪州
文章
5
粉丝
0
获赞
0