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

2022-08-31 13:27:33 +08:00
 jxia

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

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

功能简介

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

1263 次点击
所在节点    Go 编程语言
3 条回复
notamail
2022-08-31 16:02:27 +08:00
viper 多好
keepeye
2022-08-31 16:41:20 +08:00
有性能测试吗
jxia
2022-09-26 17:30:29 +08:00
@notamail 使用习惯上不太一样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/876699

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX