golang多格式配置文件管理插件库gookit/config的使用

golang多格式配置文件管理插件库gookit/config的使用

config 是一个简单且功能齐全的Go应用程序配置管理工具库。

特性

  • 支持多种格式:JSON(默认)、JSON5INIPropertiesYAMLTOMLHCLENVFlags
    • JSON 内容支持注释,会自动清除注释
    • 其他驱动按需使用,不使用时不会加载到应用程序中
  • 支持多文件和多数据加载
  • 支持从系统环境变量加载配置
  • 支持从远程URL加载配置数据
  • 支持从命令行(flags)设置配置数据
  • 支持监听和触发配置数据变更事件
  • 支持数据覆盖和合并,加载多份数据时自动按key加载
  • 支持将全部或部分配置数据绑定到结构体
  • 支持通过key-path获取子值,如 map.key arr.2
  • 支持解析ENV名称并允许设置默认值
  • 通用API:GetIntUintInt64FloatStringBoolIntsIntMapStringsStringMap
  • 完整的单元测试(代码覆盖率>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 提供了强大而灵活的配置管理功能,主要优点包括:

  1. 多格式支持,可以同时处理不同格式的配置文件
  2. 简洁的API,易于使用
  3. 支持配置合并和环境变量覆盖
  4. 支持配置热更新
  5. 支持数据结构绑定

对于需要管理复杂配置的Go应用程序,gookit/config是一个值得考虑的选择。

回到顶部