golang多格式配置文件管理插件库gookit/config的使用
golang多格式配置文件管理插件库gookit/config的使用
config
是一个简单且功能齐全的Go应用程序配置管理工具库。
特性
- 支持多种格式:
JSON
(默认)、JSON5
、INI
、Properties
、YAML
、TOML
、HCL
、ENV
、Flags
JSON
内容支持注释,会自动清除注释- 其他驱动按需使用,不使用时不会加载到应用程序中
- 支持多文件和多数据加载
- 支持从系统环境变量加载配置
- 支持从远程URL加载配置数据
- 支持从命令行(
flags
)设置配置数据 - 支持监听和触发配置数据变更事件
- 支持数据覆盖和合并,加载多份数据时自动按key加载
- 支持将全部或部分配置数据绑定到结构体
- 支持通过key-path获取子值,如
map.key
arr.2
- 支持解析ENV名称并允许设置默认值
- 通用API:
Get
、Int
、Uint
、Int64
、Float
、String
、Bool
、Ints
、IntMap
、Strings
、StringMap
等 - 完整的单元测试(代码覆盖率>95%)
安装
go get github.com/gookit/config/v2
使用示例
加载YAML配置
package main
import (
"github.com/gookit/config/v2"
"github.com/gookit/config/v2/yaml"
)
func main() {
// 配置解析环境变量,如:shell: ${SHELL}
config.WithOptions(config.ParseEnv)
// 添加YAML格式驱动
config.AddDriver(yaml.Driver)
// 加载配置文件
err := config.LoadFiles("testdata/yml_base.yml")
if err != nil {
panic(err)
}
// 可以加载多个文件
err = config.LoadFiles("testdata/yml_other.yml")
// 也可以一次加载多个文件
// err := config.LoadFiles("testdata/yml_base.yml", "testdata/yml_other.yml")
if err != nil {
panic(err)
}
}
绑定到结构体
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
获取配置值
// 获取整数
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", arr1) // []string{"val1", "val21"}
// 获取字符串map
val := config.StringMap("map1")
fmt.Printf("%#v",val) // map[string]string{"key":"val2", "key2":"val20"}
从环境变量加载
// 环境变量: APP_NAME=config APP_DEBUG=true DB_USERNAME=someone
// 加载环境变量
config.LoadOSEnvs(map[string]string{
"APP_NAME": "app_name",
"APP_DEBUG": "app_debug",
"DB_USERNAME": "db.username"
})
// 读取
config.Bool("app_debug") // true
config.String("app_name") // "config"
从命令行参数加载
// 定义flag格式: name:type:desc 或 name:type 或 name:desc
keys := []string{
"name",
"env:set the run env",
"age:int",
"debug:bool:set debug mode",
"map1.sub-key",
}
err := config.LoadFlags(keys)
// 读取
config.String("name") // "inhere"
config.String("env") // "dev"
config.Int("age") // 99
config.Bool("debug") // true
config.Get("map1") // map[string]any{"sub-key":"val"}
监听配置变更
hookFn := func(event string, c *Config) {
fmt.Println("fire the:", event)
}
// 创建配置实例时添加钩子函数
c := NewWithOptions("test", config.WithHookFunc(hookFn))
// 或者为全局配置添加
config.WithOptions(config.WithHookFunc(hookFn))
导出配置数据
// 导出为JSON
buf := new(bytes.Buffer)
_, err := config.DumpTo(buf, config.JSON)
ioutil.WriteFile("my-config.json", buf.Bytes(), 0755)
// 导出为YAML
_, err = config.DumpTo(buf, config.YAML)
ioutil.WriteFile("my-config.yaml", buf.Bytes(), 0755)
完整示例
package main
import (
"fmt"
"github.com/gookit/config/v2"
"github.com/gookit/config/v2/yaml"
)
func main() {
// 1. 初始化配置
config.WithOptions(config.ParseEnv, config.ParseDefault)
config.AddDriver(yaml.Driver)
// 2. 加载配置文件
err := config.LoadFiles("config.yml")
if err != nil {
panic(err)
}
// 3. 定义配置结构
type Database struct {
Host string `mapstructure:"host"`
Port int `mapstructure:"port"`
Username string `mapstructure:"username"`
Password string `mapstructure:"password"`
}
type AppConfig struct {
Name string `mapstructure:"name"`
Debug bool `mapstructure:"debug"`
Port int `mapstructure:"port"`
DB Database `mapstructure:"db"`
Servers []string `mapstructure:"servers"`
}
// 4. 绑定配置到结构体
var cfg AppConfig
err = config.Decode(&cfg)
if err != nil {
panic(err)
}
// 5. 使用配置
fmt.Printf("App Name: %s\n", cfg.Name)
fmt.Printf("DB Host: %s\n", cfg.DB.Host)
fmt.Printf("Servers: %v\n", cfg.Servers)
// 6. 动态获取配置值
debug := config.Bool("debug")
dbPort := config.Int("db.port")
fmt.Printf("Debug mode: %v, DB Port: %d\n", debug, dbPort)
}
这个库提供了非常灵活的配置管理功能,支持多种格式的配置文件,并能方便地与结构体绑定,适合各种规模的Go项目使用。
更多关于golang多格式配置文件管理插件库gookit/config的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang多格式配置文件管理插件库gookit/config的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
gookit/config - Golang多格式配置文件管理库
gookit/config 是一个功能强大的Go语言配置文件管理库,支持多种配置文件格式,提供了统一的API来读取和写入配置数据。
主要特性
- 支持多种格式:JSON, YAML, TOML, INI, HCL, ENV, Properties等
- 支持多文件加载
- 支持环境变量覆盖
- 支持配置数据合并
- 支持配置热更新
- 简单易用的API
安装
go get github.com/gookit/config/v2
基本使用示例
1. 加载和读取配置
package main
import (
"fmt"
"github.com/gookit/config/v2"
"github.com/gookit/config/v2/yaml"
)
func main() {
// 创建配置实例
conf := config.New("myapp")
// 添加YAML解析器
conf.AddDriver(yaml.Driver)
// 加载配置文件
err := conf.LoadFiles("config.yml")
if err != nil {
panic(err)
}
// 读取配置值
name := conf.String("name")
port := conf.Int("server.port")
debug := conf.Bool("debug")
fmt.Printf("name: %s, port: %d, debug: %v\n", name, port, debug)
// 读取嵌套配置
host := conf.String("server.host")
fmt.Println("server host:", host)
}
2. 多格式配置示例
package main
import (
"fmt"
"github.com/gookit/config/v2"
"github.com/gookit/config/v2/json"
"github.com/gookit/config/v2/yaml"
)
func main() {
conf := config.New("myapp")
// 添加多种格式支持
conf.AddDriver(yaml.Driver)
conf.AddDriver(json.Driver)
// 加载多个配置文件
err := conf.LoadFiles("config.yml", "config.json")
if err != nil {
panic(err)
}
// 读取配置
fmt.Println("app name:", conf.String("name"))
fmt.Println("database host:", conf.String("database.host"))
}
3. 设置默认值和环境变量覆盖
package main
import (
"fmt"
"github.com/gookit/config/v2"
"github.com/gookit/config/v2/yaml"
"os"
)
func main() {
// 设置环境变量
os.Setenv("APP_PORT", "8080")
conf := config.New("myapp").WithOptions(config.ParseEnv)
conf.AddDriver(yaml.Driver)
// 加载配置
err := conf.LoadFiles("config.yml")
if err != nil {
panic(err)
}
// 设置默认值
conf.SetDefault("server.port", 3000)
// 环境变量会覆盖配置文件中的值
port := conf.Int("server.port") // 将返回8080
fmt.Println("server port:", port)
}
4. 配置热更新
package main
import (
"fmt"
"github.com/gookit/config/v2"
"github.com/gookit/config/v2/yaml"
"time"
)
func main() {
conf := config.New("myapp")
conf.AddDriver(yaml.Driver)
// 启用自动重新加载
conf.OnChange(func(c *config.Config) {
fmt.Println("config changed!")
})
err := conf.LoadFiles("config.yml")
if err != nil {
panic(err)
}
// 模拟文件修改
go func() {
time.Sleep(3 * time.Second)
// 这里应该有实际的文件修改操作
fmt.Println("config file modified")
}()
// 主程序继续运行
select {}
}
5. 写入配置文件
package main
import (
"fmt"
"github.com/gookit/config/v2"
"github.com/gookit/config/v2/yaml"
)
func main() {
conf := config.New("myapp")
conf.AddDriver(yaml.Driver)
// 设置配置值
conf.Set("name", "myapp")
conf.Set("server.host", "localhost")
conf.Set("server.port", 8080)
conf.Set("debug", true)
// 写入到文件
err := conf.DumpToFile("config.yml")
if err != nil {
panic(err)
}
fmt.Println("config file saved")
}
高级功能
1. 数据结构绑定
type ServerConfig struct {
Host string `json:"host"`
Port int `json:"port"`
}
type AppConfig struct {
Name string `json:"name"`
Debug bool `json:"debug"`
Server ServerConfig `json:"server"`
}
func main() {
conf := config.New("myapp")
conf.AddDriver(yaml.Driver)
err := conf.LoadFiles("config.yml")
if err != nil {
panic(err)
}
var appCfg AppConfig
err = conf.BindStruct("", &appCfg)
if err != nil {
panic(err)
}
fmt.Printf("loaded config: %+v\n", appCfg)
}
2. 多级配置合并
func main() {
conf := config.New("myapp")
conf.AddDriver(yaml.Driver)
// 加载基础配置
err := conf.LoadFiles("base.yml")
if err != nil {
panic(err)
}
// 加载环境特定配置
err = conf.LoadFiles("prod.yml")
if err != nil {
panic(err)
}
// prod.yml中的配置会覆盖base.yml中的相同键
fmt.Println("final config:", conf.Data())
}
总结
gookit/config 提供了强大而灵活的配置管理功能,主要优点包括:
- 多格式支持,可以同时处理不同格式的配置文件
- 简洁的API,易于使用
- 支持配置合并和环境变量覆盖
- 支持配置热更新
- 支持数据结构绑定
对于需要管理复杂配置的Go应用程序,gookit/config是一个值得考虑的选择。