golang轻量级类型安全环境变量管理插件库typenv的使用
Golang轻量级类型安全环境变量管理插件库typenv的使用
Typenv简介
typenv
是一个极简的、零依赖的Go库,用于类型化的环境变量管理。它消除了手动类型转换的需要,并允许为缺失的环境变量设置默认值。
主要特点
- ✅ 消除手动类型转换
- ✅ 开箱即用支持切片类型
- ✅ 允许为缺失的环境变量设置回退值
- ✅ 零外部依赖
安装
go get diegomarangoni.dev/typenv
支持的类型
基本类型
var _ time.Duration = typenv.Duration("MY_ENV")
var _ string = typenv.String("MY_ENV")
var _ float64 = typenv.Float64("MY_ENV")
var _ float32 = typenv.Float32("MY_ENV")
var _ int64 = typenv.Int64("MY_ENV")
var _ int32 = typenv.Int32("MY_ENV")
var _ int16 = typenv.Int16("MY_ENV")
var _ int8 = typenv.Int8("MY_ENV")
var _ int = typenv.Int("MY_ENV")
var _ bool = typenv.Bool("MY_ENV")
切片类型
var _ []time.Duration = typenv.Slice[[]time.Duration]("MY_ENV", ",")
var _ []string = typenv.Slice[[]string]("MY_ENV", ",")
var _ []float64 = typenv.Slice[[]float64]("MY_ENV", ",")
var _ []float32 = typenv.Slice[[]float32]("MY_ENV", ",")
var _ []int64 = typenv.Slice[[]int64]("MY_ENV", ",")
var _ []int32 = typenv.Slice[[]int32]("MY_ENV", ",")
var _ []int16 = typenv.Slice[[]int16]("MY_ENV", ",")
var _ []int8 = typenv.Slice[[]int8]("MY_ENV", ",")
var _ []int = typenv.Slice[[]int]("MY_ENV", ",")
var _ []bool = typenv.Slice[[]bool]("MY_ENV", ",")
使用示例
基本用法
if typenv.Bool("DEBUG") {
// 当DEBUG环境变量为true时执行
}
如果环境变量未设置,将返回该类型的零值,本例中是false
。
带默认值的使用
if typenv.Bool("DEBUG", true) {
// 当DEBUG环境变量为true或未设置时执行
}
如果环境变量未设置,返回值将是true
。
完整示例
package main
import (
"fmt"
"diegomarangoni.dev/typenv"
"time"
)
func main() {
// 设置一些环境变量(实际使用时应在系统环境变量中设置)
// os.Setenv("DEBUG", "true")
// os.Setenv("PORT", "8080")
// os.Setenv("TIMEOUT", "30s")
// os.Setenv("ALLOWED_IPS", "192.168.1.1,192.168.1.2,10.0.0.1")
// 读取布尔值
debug := typenv.Bool("DEBUG", false)
fmt.Printf("Debug mode: %v\n", debug)
// 读取整数值
port := typenv.Int("PORT", 3000)
fmt.Printf("Server port: %d\n", port)
// 读取持续时间
timeout := typenv.Duration("TIMEOUT", 10*time.Second)
fmt.Printf("Request timeout: %v\n", timeout)
// 读取字符串切片
allowedIPs := typenv.Slice[[]string]("ALLOWED_IPS", ",", []string{"127.0.0.1"})
fmt.Printf("Allowed IPs: %v\n", allowedIPs)
// 读取浮点数
ratio := typenv.Float64("RATIO", 1.5)
fmt.Printf("Compression ratio: %.2f\n", ratio)
}
这个示例展示了如何使用typenv库读取各种类型的环境变量,包括布尔值、整数、持续时间、字符串切片和浮点数,每种类型都提供了默认值。
typenv是一个简单但功能强大的库,可以大大简化Go程序中环境变量的处理,特别是当你需要类型安全和默认值时。
更多关于golang轻量级类型安全环境变量管理插件库typenv的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang轻量级类型安全环境变量管理插件库typenv的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用typenv管理Golang环境变量
typenv是一个轻量级的类型安全环境变量管理库,它可以帮助开发者以类型安全的方式管理和访问环境变量。下面我将详细介绍typenv的使用方法。
安装
go get github.com/yp05327/typenv
基本用法
1. 定义配置结构体
首先定义一个结构体来表示你的配置,使用结构体标签来指定环境变量名:
type Config struct {
Port int `env:"PORT" default:"8080"`
Debug bool `env:"DEBUG"`
Database string `env:"DB_URL" required:"true"`
Timeout int64 `env:"TIMEOUT" default:"30"`
}
2. 加载环境变量
使用Load
函数加载环境变量到配置结构体:
package main
import (
"fmt"
"github.com/yp05327/typenv"
)
func main() {
var cfg Config
if err := typenv.Load(&cfg); err != nil {
panic(err)
}
fmt.Printf("Config: %+v\n", cfg)
}
高级特性
自定义解析器
typenv支持自定义类型解析器。例如,解析时间间隔:
type Duration time.Duration
func (d *Duration) UnmarshalText(text []byte) error {
dur, err := time.ParseDuration(string(text))
if err != nil {
return err
}
*d = Duration(dur)
return nil
}
type Config struct {
Interval Duration `env:"INTERVAL" default:"1h"`
}
嵌套结构体
typenv支持嵌套结构体:
type DBConfig struct {
Host string `env:"DB_HOST" default:"localhost"`
Port int `env:"DB_PORT" default:"5432"`
}
type Config struct {
Database DBConfig `envPrefix:"DB_"`
AppName string `env:"APP_NAME"`
}
环境变量前缀
可以为嵌套结构体设置环境变量前缀:
type Config struct {
Database DBConfig `envPrefix:"DB_"`
// 对应的环境变量将是 DB_HOST 和 DB_PORT
}
必填字段验证
标记字段为必填:
type Config struct {
APIKey string `env:"API_KEY" required:"true"`
}
默认值
为字段设置默认值:
type Config struct {
Workers int `env:"WORKERS" default:"4"`
}
完整示例
package main
import (
"fmt"
"time"
"github.com/yp05327/typenv"
)
type Duration time.Duration
func (d *Duration) UnmarshalText(text []byte) error {
dur, err := time.ParseDuration(string(text))
if err != nil {
return err
}
*d = Duration(dur)
return nil
}
type DBConfig struct {
Host string `env:"HOST" default:"localhost"`
Port int `env:"PORT" default:"5432"`
Username string `env:"USERNAME" required:"true"`
Password string `env:"PASSWORD" required:"true"`
}
type Config struct {
AppName string `env:"APP_NAME" default:"myapp"`
Debug bool `env:"DEBUG"`
Timeout Duration `env:"TIMEOUT" default:"30s"`
Database DBConfig `envPrefix:"DB_"`
}
func main() {
var cfg Config
if err := typenv.Load(&cfg); err != nil {
panic(fmt.Errorf("failed to load config: %w", err))
}
fmt.Printf("Config: %+v\n", cfg)
fmt.Printf("DB Host: %s\n", cfg.Database.Host)
fmt.Printf("Timeout: %v\n", time.Duration(cfg.Timeout))
}
最佳实践
- 集中管理配置:将所有环境变量配置集中在一个结构体中
- 使用默认值:为可选参数设置合理的默认值
- 明确必填项:标记所有必需的配置项
- 使用嵌套结构体:按功能模块组织配置
- 添加前缀:避免环境变量名冲突
typenv通过结构体标签和反射提供了类型安全的环境变量管理方式,比直接使用os.Getenv
更加健壮和易于维护。它特别适合在微服务架构或需要大量环境变量配置的应用中使用。