golang环境变量配置管理插件库kelseyhightower/envconfig的使用
golang环境变量配置管理插件库kelseyhightower/envconfig的使用
基本使用
envconfig 是一个 Go 语言的库,用于将环境变量映射到结构体字段。以下是基本使用方法:
- 首先设置环境变量:
export MYAPP_DEBUG=false
export MYAPP_PORT=8080
export MYAPP_USER=Kelsey
export MYAPP_RATE="0.5"
export MYAPP_TIMEOUT="3m"
export MYAPP_USERS="rob,ken,robert"
export MYAPP_COLORCODES="red:1,green:2,blue:3"
- 然后编写 Go 代码:
package main
import (
"fmt"
"log"
"time"
"github.com/kelseyhightower/envconfig"
)
// 定义配置结构体
type Specification struct {
Debug bool
Port int
User string
Users []string
Rate float32
Timeout time.Duration
ColorCodes map[string]int
}
func main() {
var s Specification
// 处理环境变量,前缀为"myapp"
err := envconfig.Process("myapp", &s)
if err != nil {
log.Fatal(err.Error())
}
// 打印配置
format := "Debug: %v\nPort: %d\nUser: %s\nRate: %f\nTimeout: %s\n"
_, err = fmt.Printf(format, s.Debug, s.Port, s.User, s.Rate, s.Timeout)
if err != nil {
log.Fatal(err.Error())
}
fmt.Println("Users:")
for _, u := range s.Users {
fmt.Printf(" %s\n", u)
}
fmt.Println("Color codes:")
for k, v := range s.ColorCodes {
fmt.Printf(" %s: %d\n", k, v)
}
}
运行结果将会是:
Debug: false
Port: 8080
User: Kelsey
Rate: 0.500000
Timeout: 3m0s
Users:
rob
ken
robert
Color codes:
red: 1
green: 2
blue: 3
结构体标签支持
envconfig 支持使用结构体标签来指定替代、默认和必需的环境变量:
type Specification struct {
ManualOverride1 string `envconfig:"manual_override_1"` // 手动指定环境变量名
DefaultVar string `default:"foobar"` // 设置默认值
RequiredVar string `required:"true"` // 标记为必需字段
IgnoredVar string `ignored:"true"` // 忽略此字段
AutoSplitVar string `split_words:"true"` // 自动拆分驼峰命名
RequiredAndAutoSplitVar string `required:"true" split_words:"true"` // 组合使用
}
标签说明:
envconfig:"NAME"
- 手动指定环境变量名称default:"VALUE"
- 设置默认值required:"true"
- 标记为必需字段ignored:"true"
- 忽略此字段split_words:"true"
- 自动拆分驼峰命名
支持的结构体字段类型
envconfig 支持以下结构体字段类型:
- string
- int8, int16, int32, int64
- bool
- float32, float64
- 任何支持类型的切片
- 映射(键和值为任何支持类型)
- encoding.TextUnmarshaler
- encoding.BinaryUnmarshaler
- time.Duration
自定义解码器
任何实现了 envconfig.Decoder
接口的类型可以控制自己的反序列化:
type IPDecoder net.IP
func (ipd *IPDecoder) Decode(value string) error {
*ipd = IPDecoder(net.ParseIP(value))
return nil
}
type DNSConfig struct {
Address IPDecoder `envconfig:"DNS_SERVER"`
}
复杂类型解码示例
type providerDetails struct {
Name string
Weight int
}
type SMSProviderDecoder map[string][]providerDetails
func (sd *SMSProviderDecoder) Decode(value string) error {
smsProvider := map[string][]providerDetails{}
pairs := strings.Split(value, ";")
for _, pair := range pairs {
providerdata := []providerDetails{}
kvpair := strings.Split(pair, "=")
if len(kvpair) != 2 {
return fmt.Errorf("invalid map item: %q", pair)
}
err := json.Unmarshal([]byte(kvpair[1]), &providerdata)
if err != nil {
return fmt.Errorf("invalid map json: %w", err)
}
smsProvider[kvpair[0]] = providerdata
}
*sd = SMSProviderDecoder(smsProvider)
return nil
}
type SMSProviderConfig struct {
ProviderWithWeight SMSProviderDecoder `envconfig:"SMS_PROVIDER_WITH_WEIGHT"`
}
envconfig 是一个强大且灵活的环境变量管理库,可以大大简化 Go 应用程序的配置管理。
更多关于golang环境变量配置管理插件库kelseyhightower/envconfig的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang环境变量配置管理插件库kelseyhightower/envconfig的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用 kelseyhightower/envconfig 管理 Go 环境变量配置
envconfig
是由 Kelsey Hightower 开发的一个 Go 库,它提供了一种简单的方式来管理应用程序的环境变量配置。这个库可以帮助你将环境变量自动映射到结构体字段,支持默认值、必填验证等功能。
安装
go get github.com/kelseyhightower/envconfig
基本用法
1. 定义配置结构体
首先定义一个结构体来表示你的配置:
type Config struct {
Port int `default:"8080"`
DatabaseURL string `required:"true"`
Debug bool `default:"false"`
Timeout int `default:"30"`
}
标签说明:
default
: 设置默认值required:"true"
: 表示该字段必须提供
2. 解析环境变量
package main
import (
"fmt"
"log"
"github.com/kelseyhightower/envconfig"
)
type Config struct {
Port int `default:"8080"`
DatabaseURL string `required:"true"`
Debug bool `default:"false"`
Timeout int `default:"30"`
}
func main() {
var cfg Config
err := envconfig.Process("myapp", &cfg)
if err != nil {
log.Fatal(err.Error())
}
fmt.Printf("Port: %d\n", cfg.Port)
fmt.Printf("DatabaseURL: %s\n", cfg.DatabaseURL)
fmt.Printf("Debug: %t\n", cfg.Debug)
fmt.Printf("Timeout: %d\n", cfg.Timeout)
}
3. 设置环境变量
在运行程序前设置环境变量:
export MYAPP_DATABASEURL="postgres://user:pass@localhost/dbname"
# 其他变量使用默认值
或者全部设置:
export MYAPP_PORT=9090
export MYAPP_DATABASEURL="postgres://user:pass@localhost/dbname"
export MYAPP_DEBUG=true
export MYAPP_TIMEOUT=60
高级特性
1. 自定义前缀
Process
方法的第一个参数是环境变量前缀,设置为空字符串表示不使用前缀:
err := envconfig.Process("", &cfg) // 直接使用 PORT, DATABASE_URL 等变量名
2. 嵌套结构体
type Config struct {
Port int `default:"8080"`
Database struct {
URL string `required:"true"`
PoolSize int `default:"10"`
}
}
// 环境变量:
// MYAPP_DATABASE_URL
// MYAPP_DATABASE_POOLSIZE
3. 切片支持
type Config struct {
Hosts []string `default:"localhost,127.0.0.1"`
}
// 环境变量:
// MYAPP_HOSTS="host1,host2,host3"
4. 自定义分隔符
默认使用逗号分隔切片,可以自定义:
type Config struct {
Hosts []string `envconfig:"HOSTS" default:"localhost|127.0.0.1" delimiter:"|"`
}
5. 自定义变量名
type Config struct {
DBURL string `envconfig:"DATABASE_URL" required:"true"`
}
// 使用 DATABASE_URL 而不是 DBURL
完整示例
package main
import (
"fmt"
"log"
"time"
"github.com/kelseyhightower/envconfig"
)
type Config struct {
Port int `default:"8080"`
Timeout time.Duration `default:"30s"`
DatabaseURL string `required:"true"`
Debug bool `default:"false"`
Redis struct {
Host string `default:"localhost"`
Port int `default:"6379"`
Password string `default:""`
}
AllowedOrigins []string `default:"http://localhost,https://example.com"`
}
func main() {
var cfg Config
err := envconfig.Process("myapp", &cfg)
if err != nil {
log.Fatal(err.Error())
}
fmt.Printf("Server will run on port %d\n", cfg.Port)
fmt.Printf("Timeout: %v\n", cfg.Timeout)
fmt.Printf("Database URL: %s\n", cfg.DatabaseURL)
fmt.Printf("Debug mode: %t\n", cfg.Debug)
fmt.Printf("Redis: %s:%d\n", cfg.Redis.Host, cfg.Redis.Port)
fmt.Printf("Allowed origins: %v\n", cfg.AllowedOrigins)
}
环境变量设置示例
export MYAPP_PORT=9090
export MYAPP_TIMEOUT=60s
export MYAPP_DATABASEURL="postgres://user:pass@localhost/db"
export MYAPP_DEBUG=true
export MYAPP_REDIS_HOST="redis.example.com"
export MYAPP_REDIS_PORT=6380
export MYAPP_ALLOWEDORIGINS="https://app.com,https://api.app.com"
优点
- 类型安全:自动将环境变量转换为正确的Go类型
- 默认值支持:可以为字段设置默认值
- 必填验证:确保关键配置不会缺失
- 嵌套结构支持:支持复杂的配置结构
- 命名灵活:支持自定义环境变量名
envconfig
是一个轻量级但功能强大的配置管理库,特别适合12-factor应用的环境变量配置管理。