golang基于标签的类型安全配置解析插件库gonfig的使用

Golang基于标签的类型安全配置解析插件库gonfig的使用

介绍

Gonfig是一个基于标签的配置解析库,可以从不同的提供者加载值到类型安全的struct中。

安装

需要Go 1.15+版本:

go get -u github.com/miladabc/gonfig

使用示例

package main

import (
    "fmt"
    "net/url"
    "time"

    "github.com/miladabc/gonfig"
)

// 未导出的struct字段会被忽略
type Config struct {
	Host     string
	Log      bool
	Expiry   int
	Port     uint
	Pi       float64
	Com      complex128
	Byte     byte
	Rune     rune
	Duration time.Duration
	Time     time.Time
	url      url.URL
	Redis    struct {
		Hosts []string
		Ports []int
	}
}

func main() {
	var c Config

	// 输入参数必须是指向struct的指针
	err := gonfig.Load().FromEnv().Into(&c)
	if err != nil {
		fmt.Println(err)
	}
}

标签说明

所有标签都是可选的。

Config标签

config标签用于更改获取字段值的默认键名。

type Config struct {
	HostName string `config:"HOST"`
}

func main() {
	var c Config

	os.Setenv("HOST", "golang.org")
	gonfig.Load().FromEnv().Into(&c)
}

文件相关标签

jsonyamltoml标签用于更改从文件中获取值的默认键名。

type Config struct {
	HostName string `json:"host" yaml:"host" toml:"host"`
}

func main() {
	var c Config

	gonfig.Load().FromFile("config.json").Into(&c)
}

Default标签

default标签用于声明缺失值时的默认值。

type Config struct {
	Host url.URL `default:"golang.org"`
}

Required标签

required标签用于确保字段有值。默认情况下字段是可选的。

type Config struct {
	Host url.URL `required:"true"`
}

Ignore标签

ignore标签用于跳过填充字段。默认为false

type Config struct {
	Ignored     int `ignore:"true"`
	AlsoIgnored int `config:"-"`
}

Expand标签

expand标签用于从OS环境变量扩展值。默认为false

type Config struct {
	Expanded int `expand:"true" default:"${ENV_VALUE}"`
}

func main() {
	var c Config

	os.Setenv("ENV_VALUE", "123")
	gonfig.Load().FromEnv().Into(&c)
	fmt.Println(c.Expanded) // 123
}

Separator标签

separator标签用于分隔切片/数组项。默认分隔符是单个空格。

type Config struct {
	List []int `separator:"," default:"1, 2, 3"`
}

Format标签

format标签用于解析时间字符串。默认格式是time.RFC3339

type Config struct {
	Time time.Time `format:"2006-01-02T15:04:05.999999999Z07:00"`
}

提供者

提供者可以链式调用,并按指定顺序应用。如果为字段提供了多个值,将应用最后一个值。

支持的提供者

  • 环境变量
  • 文件
    • .json
    • .yaml (.yml)
    • .toml
    • .env
func main() {
	var c Config

	gonfig.
		Load().
		FromEnv().
		FromFile("config.json").
		FromFile("config.yaml").
		FromFile("config.toml").
		FromFile(".env").
		AddProvider(CustomProvider).
		Into(&c)
}

自定义提供者

你可以通过实现Provider接口以及UnmarshalerFiller接口中的一个或两个来使用自己的提供者。

type CustomProvider struct{}

func (cp *CustomProvider) Name() string {
	return "custom provider"
}

func (cp *CustomProvider) UnmarshalStruct(i interface{}) error {
	// UnmarshalStruct接收一个结构体指针并将值解组到其中
	return nil
}

func (cp *CustomProvider) Fill(in *gonfig.Input) error {
	// Fill接收结构体字段并设置它们的值
	return nil
}

func main() {
	var c Config

	gonfig.
		Load().
		AddProvider(new(CustomProvider)).
		Into(&c)
}

支持的类型

除了以下类型外,其他类型都会导致错误:

  • string
  • bool
  • int, int8, int16, int32, int64
  • uint, uint8, uint16, uint32, uint64
  • float32, float64
  • complex64, complex128
  • byte
  • rune
  • time.Duration
  • time.Time
  • url.URL
  • 上述类型的pointerslicearray
  • nestedembedded结构体

许可证

该库在MIT许可证下发布。


更多关于golang基于标签的类型安全配置解析插件库gonfig的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang基于标签的类型安全配置解析插件库gonfig的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang基于标签的类型安全配置解析插件库gonfig使用指南

gonfig是一个基于标签的Golang配置解析库,它提供了类型安全的配置管理方式,支持从多种来源(如环境变量、命令行参数、JSON/YAML文件等)加载配置。

安装

go get github.com/gonfig/gonfig

基本使用

1. 定义配置结构

首先定义一个结构体,使用gonfig标签指定配置来源:

type Config struct {
    Port     int    `gonfig:"env=PORT;default=8080"`
    LogLevel string `gonfig:"env=LOG_LEVEL;default=info"`
    Database struct {
        Host     string `gonfig:"env=DB_HOST;default=localhost"`
        Port     int    `gonfig:"env=DB_PORT;default=5432"`
        Username string `gonfig:"env=DB_USER;required"`
        Password string `gonfig:"env=DB_PASS;required"`
    }
}

2. 加载配置

package main

import (
    "fmt"
    "github.com/gonfig/gonfig"
)

func main() {
    var cfg Config
    
    // 创建配置加载器
    loader := gonfig.NewLoader()
    
    // 加载配置
    if err := loader.Load(&cfg); err != nil {
        panic(fmt.Errorf("failed to load config: %v", err))
    }
    
    fmt.Printf("Server will run on port %d\n", cfg.Port)
    fmt.Printf("Database connection: %s:%d\n", cfg.Database.Host, cfg.Database.Port)
}

标签语法

gonfig支持以下标签选项:

  • env=VAR_NAME:从环境变量读取
  • default=VALUE:设置默认值
  • required:标记为必填项
  • file=path/to/file:从文件读取
  • flag=flag-name:从命令行标志读取
  • json=field_name:指定JSON字段名
  • yaml=field_name:指定YAML字段名

高级功能

多来源配置

type Config struct {
    // 优先级: 命令行 > 环境变量 > 默认值
    Debug bool `gonfig:"flag=debug;env=DEBUG;default=false"`
}

嵌套结构

type Config struct {
    Server struct {
        Host string `gonfig:"env=SERVER_HOST;default=0.0.0.0"`
        Port int    `gonfig:"env=SERVER_PORT;default=8080"`
    }
    Database struct {
        URL string `gonfig:"env=DB_URL;required"`
    }
}

自定义解析器

type DurationConfig struct {
    Timeout time.Duration `gonfig:"env=TIMEOUT;default=5s"`
}

// 注册自定义类型解析器
gonfig.RegisterParser(func(v string) (interface{}, error) {
    return time.ParseDuration(v)
}, time.Duration(0))

从文件加载

type FileConfig struct {
    Key1 string `gonfig:"file=./config.json;json=key1"`
    Key2 int    `gonfig:"file=./config.yaml;yaml=key2"`
}

完整示例

package main

import (
    "fmt"
    "log"
    "time"
    
    "github.com/gonfig/gonfig"
)

type AppConfig struct {
    AppName string `gonfig:"env=APP_NAME;default=myapp"`
    Debug   bool   `gonfig:"env=DEBUG;default=false"`
    
    Server struct {
        Host        string        `gonfig:"env=HOST;default=0.0.0.0"`
        Port        int           `gonfig:"env=PORT;default=8080"`
        Timeout     time.Duration `gonfig:"env=TIMEOUT;default=30s"`
        EnableHTTPS bool          `gonfig:"env=ENABLE_HTTPS;default=false"`
    }
    
    Database struct {
        URL      string `gonfig:"env=DB_URL;required"`
        PoolSize int    `gonfig:"env=DB_POOL_SIZE;default=10"`
    }
    
    Features struct {
        FeatureA bool `gonfig:"env=FEATURE_A;default=true"`
        FeatureB bool `gonfig:"env=FEATURE_B;default=false"`
    }
}

func main() {
    var cfg AppConfig
    
    // 注册持续时间解析器
    gonfig.RegisterParser(func(v string) (interface{}, error) {
        return time.ParseDuration(v)
    }, time.Duration(0))
    
    // 创建加载器
    loader := gonfig.NewLoader()
    
    // 加载配置
    if err := loader.Load(&cfg); err != nil {
        log.Fatalf("Failed to load config: %v", err)
    }
    
    // 使用配置
    fmt.Printf("Starting %s on %s:%d\n", cfg.AppName, cfg.Server.Host, cfg.Server.Port)
    if cfg.Debug {
        fmt.Println("Debug mode enabled")
    }
}

最佳实践

  1. 明确区分必填和可选配置:使用required标签标记必须提供的配置项
  2. 提供合理的默认值:为可选配置项设置合理的默认值
  3. 使用嵌套结构:按功能模块组织配置项
  4. 环境特定配置:可以通过不同的标签组合实现环境特定的配置
  5. 配置验证:在加载后添加自定义验证逻辑

gonfig通过标签系统提供了灵活且类型安全的配置管理方式,非常适合中大型Golang项目的配置管理需求。

回到顶部