V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jxia
V2EX  ›  Go 编程语言

gookit/config - Go 应用配置管理,支持多种格式,多文件加载,数据合并,解析环境变量名等

  •  1
     
  •   jxia · 2022-08-31 13:27:33 +08:00 · 1210 次点击
    这是一个创建于 610 天前的主题,其中的信息可能已经有所发展或是发生改变。

    gookit/config - Go 应用配置管理,支持多种格式,多文件加载,数据合并,解析环境变量名,绑定到结构体等等

    Github: https://github.com/gookit/config

    功能简介

    • 支持多种格式: 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)
    	}
    }
    

    绑定数据到结构体

    注意:结构体默认的绑定映射 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.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
    

    更多

    更多使用说明请看 README

    3 条回复    2022-09-26 17:30:29 +08:00
    notamail
        1
    notamail  
       2022-08-31 16:02:27 +08:00
    viper 多好
    keepeye
        2
    keepeye  
       2022-08-31 16:41:20 +08:00
    有性能测试吗
    jxia
        3
    jxia  
    OP
       2022-09-26 17:30:29 +08:00
    @notamail 使用习惯上不太一样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2036 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:57 · PVG 09:57 · LAX 18:57 · JFK 21:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.