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

1 回复

更多关于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))
}

最佳实践

  1. 集中管理配置:将所有环境变量配置集中在一个结构体中
  2. 使用默认值:为可选参数设置合理的默认值
  3. 明确必填项:标记所有必需的配置项
  4. 使用嵌套结构体:按功能模块组织配置
  5. 添加前缀:避免环境变量名冲突

typenv通过结构体标签和反射提供了类型安全的环境变量管理方式,比直接使用os.Getenv更加健壮和易于维护。它特别适合在微服务架构或需要大量环境变量配置的应用中使用。

回到顶部