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)
}
文件相关标签
json
、yaml
和toml
标签用于更改从文件中获取值的默认键名。
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
接口以及Unmarshaler
和Filler
接口中的一个或两个来使用自己的提供者。
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
- 上述类型的
pointer
、slice
和array
nested
和embedded
结构体
许可证
该库在MIT许可证下发布。
更多关于golang基于标签的类型安全配置解析插件库gonfig的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于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")
}
}
最佳实践
- 明确区分必填和可选配置:使用
required
标签标记必须提供的配置项 - 提供合理的默认值:为可选配置项设置合理的默认值
- 使用嵌套结构:按功能模块组织配置项
- 环境特定配置:可以通过不同的标签组合实现环境特定的配置
- 配置验证:在加载后添加自定义验证逻辑
gonfig通过标签系统提供了灵活且类型安全的配置管理方式,非常适合中大型Golang项目的配置管理需求。