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格式的字段将被解析为camelcase,并传递给匹配camel的源。

例如,envPrefix字段被拆分为envprefix,标签值作为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 应用程序配置管理的轻量级库,它支持从多种来源加载配置(如环境变量、命令行参数、配置文件等),并将它们统一到一个结构体中。

主要特性

  1. 支持多种配置源:环境变量、命令行参数、JSON/YAML/TOML 文件
  2. 结构体标签绑定
  3. 配置验证
  4. 默认值设置
  5. 嵌套配置结构

安装

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)
}

最佳实践

  1. 分层配置:将配置分为默认值、环境变量、配置文件、命令行参数等层次
  2. 敏感信息:不要将密码等敏感信息硬编码或提交到版本控制
  3. 配置验证:对关键配置项进行验证
  4. 文档化:使用结构体标签的 flagDesc 等字段为配置项添加描述
  5. 环境区分:为不同环境(开发、测试、生产)使用不同的配置文件

gofigure 通过简单的结构体标签和统一的加载接口,大大简化了 Go 应用程序的配置管理,使得应用程序可以灵活适应不同的部署环境。

回到顶部