golang简化Go应用配置管理的插件库gofigure的使用
golang简化Go应用配置管理的插件库gofigure的使用
Go配置管理变得简单!
- 只需定义一个结构体并调用Gofigure
- 支持字符串、整数/无符号整数/浮点数、切片和嵌套结构体
- 支持环境变量和命令行标志
需要Go 1.2+版本,因为Go的flag包有所不同。
示例
package main
import "github.com/ian-kent/gofigure"
type config struct {
gofigure interface{} `envPrefix:"BAR" order:"flag,env"`
RemoteAddr string `env:"REMOTE_ADDR" flag:"remote-addr" flagDesc:"Remote address"`
LocalAddr string `env:"LOCAL_ADDR" flag:"local-addr" flagDesc:"Local address"`
NumCPU int `env:"NUM_CPU" flag:"num-cpu" flagDesc:"Number of CPUs"`
Sources []string `env:"SOURCES" flag:"source" flagDesc:"Source URL (can be provided multiple times)"`
Numbers []int `env:"NUMBERS" flag:"number" flagDesc:"Number (can be provided multiple times)"`
Advanced struct{
MaxBytes int64 `env:"MAX_BYTES" flag:"max-bytes" flagDesc:"Max bytes"`
MaxErrors int64 `env:"MAX_ERRORS" flag:"max-errors" flagDesc:"Max errors"`
}
}
func main() {
var cfg config
err := gofigure.Gofigure(&cfg)
if err != nil {
log.Fatal(err)
}
// 使用cfg
}
gofigure字段
gofigure字段用于配置Gofigure。
order
标签用于设置配置源顺序,例如先环境变量后命令行选项。
任何匹配camelCase
格式的字段将被解析为camel
和case
,并传递给匹配camel
的源。
例如,envPrefix
字段被拆分为env
和prefix
,标签值作为prefix
参数传递给环境变量源。
数组和环境变量
环境变量的数组支持目前是实验性的。
要启用它,设置GOFIGURE_ENV_ARRAY=1
。
启用后,环境变量会在逗号处分割,例如:
struct {
EnvArray []string `env:"MY_ENV_VAR"`
}
MY_ENV_VAR=a,b,c
EnvArray = []string{"a", "b", "c"}
许可证
版权所有 © 2014, Ian Kent。
根据MIT许可证发布,详情请参阅LICENSE文件。
更多关于golang简化Go应用配置管理的插件库gofigure的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang简化Go应用配置管理的插件库gofigure的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
gofigure - Go应用配置管理简化库
gofigure 是一个用于简化 Go 应用程序配置管理的轻量级库,它支持从多种来源加载配置(如环境变量、命令行参数、配置文件等),并将它们统一到一个结构体中。
主要特性
- 支持多种配置源:环境变量、命令行参数、JSON/YAML/TOML 文件
- 结构体标签绑定
- 配置验证
- 默认值设置
- 嵌套配置结构
安装
go get github.com/ian-kent/gofigure
基本使用示例
package main
import (
"fmt"
"log"
"github.com/ian-kent/gofigure"
)
type Config struct {
Server struct {
Host string `env:"SERVER_HOST" flag:"host" flagDesc:"Server host" default:"localhost"`
Port int `env:"SERVER_PORT" flag:"port" flagDesc:"Server port" default:"8080"`
}
Debug bool `env:"DEBUG" flag:"debug" flagDesc:"Enable debug mode"`
LogFile string `env:"LOG_FILE" flag:"log-file" flagDesc:"Log file path"`
}
func main() {
var cfg Config
// 初始化配置
err := gofigure.Gofigure(&cfg)
if err != nil {
log.Fatalf("Failed to load configuration: %v", err)
}
fmt.Printf("Server Host: %s\n", cfg.Server.Host)
fmt.Printf("Server Port: %d\n", cfg.Server.Port)
fmt.Printf("Debug Mode: %t\n", cfg.Debug)
fmt.Printf("Log File: %s\n", cfg.LogFile)
}
高级用法
1. 自定义配置源
err := gofigure.Gofigure(
&cfg,
gofigure.EnvVarProvider(), // 环境变量
gofigure.CommandLineFlagsProvider(), // 命令行参数
gofigure.FileProvider("config.json"), // JSON 配置文件
)
2. 配置验证
type Config struct {
Port int `validate:"min=1024,max=65535"`
}
func main() {
var cfg Config
err := gofigure.Gofigure(&cfg)
if err != nil {
log.Fatal(err)
}
}
3. 多配置文件支持
err := gofigure.Gofigure(
&cfg,
gofigure.FileProvider("config.json"),
gofigure.FileProvider("config.local.json"), // 覆盖配置
)
4. 嵌套配置结构
type DatabaseConfig struct {
Host string `env:"DB_HOST" default:"localhost"`
Port int `env:"DB_PORT" default:"5432"`
Username string `env:"DB_USER"`
Password string `env:"DB_PASS"`
}
type AppConfig struct {
Server ServerConfig
Database DatabaseConfig
Feature struct {
Enabled bool `env:"FEATURE_ENABLED" default:"false"`
}
}
实际应用示例
package main
import (
"fmt"
"log"
"os"
"github.com/ian-kent/gofigure"
)
type Config struct {
AppName string `env:"APP_NAME" default:"MyApp"`
HTTP struct {
Addr string `env:"HTTP_ADDR" flag:"http-addr" default:":8080"`
Cert string `env:"HTTP_CERT" flag:"http-cert"`
Key string `env:"HTTP_KEY" flag:"http-key"`
}
Database struct {
DSN string `env:"DB_DSN" flag:"db-dsn" required:"true"`
MaxConns int `env:"DB_MAX_CONNS" default:"10"`
}
FeatureFlags struct {
NewUI bool `env:"NEW_UI" default:"false"`
Experimental bool `env:"EXPERIMENTAL" default:"false"`
}
}
func main() {
var cfg Config
// 加载配置
err := gofigure.Gofigure(
&cfg,
gofigure.EnvVarProvider(),
gofigure.CommandLineFlagsProvider(),
gofigure.FileProvider("config.yaml"),
gofigure.FileProvider("/etc/myapp/config.yaml"),
)
if err != nil {
log.Printf("Error loading configuration: %v", err)
os.Exit(1)
}
// 使用配置
fmt.Printf("Starting %s on %s\n", cfg.AppName, cfg.HTTP.Addr)
if cfg.HTTP.Cert != "" && cfg.HTTP.Key != "" {
fmt.Println("SSL enabled")
}
fmt.Printf("Database: %s (max connections: %d)\n",
cfg.Database.DSN, cfg.Database.MaxConns)
fmt.Printf("Features - NewUI: %t, Experimental: %t\n",
cfg.FeatureFlags.NewUI, cfg.FeatureFlags.Experimental)
}
最佳实践
- 分层配置:将配置分为默认值、环境变量、配置文件、命令行参数等层次
- 敏感信息:不要将密码等敏感信息硬编码或提交到版本控制
- 配置验证:对关键配置项进行验证
- 文档化:使用结构体标签的
flagDesc
等字段为配置项添加描述 - 环境区分:为不同环境(开发、测试、生产)使用不同的配置文件
gofigure 通过简单的结构体标签和统一的加载接口,大大简化了 Go 应用程序的配置管理,使得应用程序可以灵活适应不同的部署环境。