golang环境变量读取与解析插件库nasermirzaei89/env的使用

Golang环境变量读取与解析插件库nasermirzaei89/env的使用

安装

go get github.com/nasermirzaei89/env

使用示例

带默认值的用法

package main

import (
	"fmt"

	"github.com/nasermirzaei89/env"
)

func main() {
	// 获取布尔类型环境变量,带默认值
	b := env.GetBool("A", true)
	fmt.Println(b) // true (默认值)

	// 获取浮点数类型环境变量,带默认值
	f := env.GetFloat64("B", 14.5)
	fmt.Println(f) // 14.5 (默认值)

	// 获取整数类型环境变量,带默认值
	i := env.GetInt("C", 12)
	fmt.Println(i) // 12 (默认值)

	// 获取字符串类型环境变量,带默认值
	s := env.GetString("B", "hi")
	fmt.Println(s) // hi (默认值)

	// 使用泛型方法

	// 获取布尔类型环境变量(泛型),带默认值
	b2 := env.Get("A", true)
	fmt.Println(b2) // true (默认值)

	// 获取浮点数类型环境变量(泛型),带默认值
	f2 := env.Get("B", 14.5)
	fmt.Println(f2) // 14.5 (默认值)

	// 获取整数类型环境变量(泛型),带默认值
	i2 := env.Get("C", 12)
	fmt.Println(i2) // 12 (默认值)

	// 获取字符串类型环境变量(泛型),带默认值
	s2 := env.Get("B", "hi")
	fmt.Println(s2) // hi (默认值)
}

强制获取环境变量(不带默认值)

package main

import (
	"fmt"

	"github.com/nasermirzaei89/env"
)

func main() {
	// 强制获取字符串类型环境变量(必须存在)
	s := env.MustGetString("HOME")
	fmt.Println(s) // /Users/nasermirzaei89

	// 如果环境变量不存在会panic
	s = env.MustGetString("NEW") // panics

	// 使用泛型方法

	// 强制获取字符串类型环境变量(泛型,必须存在)
	s2 := env.MustGet[string]("HOME")
	fmt.Println(s2) // /Users/nasermirzaei89

	// 如果环境变量不存在会panic
	s2 = env.MustGet[string]("NEW") // panics
}

贡献

你可以提交新issue,或者fork项目进行修改,完成后创建pull request以便将代码贡献合并到主包中。


更多关于golang环境变量读取与解析插件库nasermirzaei89/env的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang环境变量读取与解析插件库nasermirzaei89/env的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用nasermirzaei89/env库读取和解析Golang环境变量

nasermirzaei89/env 是一个轻量级的Go库,用于从环境变量中读取和解析配置。它提供了简单直观的API,支持多种数据类型和自定义解析。

安装

go get github.com/nasermirzaei89/env

基本用法

1. 直接读取环境变量

package main

import (
	"fmt"
	"github.com/nasermirzaei89/env"
)

func main() {
	// 设置环境变量(演示用,实际应从系统环境变量获取)
	_ = env.Set("APP_NAME", "MyApp")
	_ = env.Set("APP_PORT", "8080")
	_ = env.Set("DEBUG_MODE", "true")

	// 读取字符串
	appName, err := env.GetString("APP_NAME")
	if err != nil {
		panic(err)
	}
	fmt.Printf("App Name: %s\n", appName)

	// 读取整数
	port, err := env.GetInt("APP_PORT")
	if err != nil {
		panic(err)
	}
	fmt.Printf("Port: %d\n", port)

	// 读取布尔值
	debug, err := env.GetBool("DEBUG_MODE")
	if err != nil {
		panic(err)
	}
	fmt.Printf("Debug Mode: %t\n", debug)
}

2. 带默认值的读取

// 读取环境变量,如果不存在则使用默认值
dbHost := env.GetStringOrDefault("DB_HOST", "localhost")
dbPort := env.GetIntOrDefault("DB_PORT", 5432)
useSSL := env.GetBoolOrDefault("DB_USE_SSL", false)

fmt.Printf("DB Host: %s, Port: %d, SSL: %t\n", dbHost, dbPort, useSSL)

3. 解析到结构体

package main

import (
	"fmt"
	"github.com/nasermirzaei89/env"
	"time"
)

type Config struct {
	AppName    string        `env:"APP_NAME"`
	Port       int           `env:"APP_PORT"`
	Debug      bool          `env:"DEBUG_MODE"`
	Timeout    time.Duration `env:"TIMEOUT"`
	Database   DatabaseConfig
	FeatureFlags map[string]bool `env:"FEATURE_"` // 读取所有以FEATURE_开头的变量
}

type DatabaseConfig struct {
	Host     string `env:"DB_HOST"`
	Port     int    `env:"DB_PORT"`
	Username string `env:"DB_USERNAME"`
	Password string `env:"DB_PASSWORD"`
}

func main() {
	// 设置环境变量
	_ = env.Set("APP_NAME", "MyApp")
	_ = env.Set("APP_PORT", "8080")
	_ = env.Set("DEBUG_MODE", "true")
	_ = env.Set("TIMEOUT", "30s")
	_ = env.Set("DB_HOST", "db.example.com")
	_ = env.Set("DB_PORT", "5432")
	_ = env.Set("DB_USERNAME", "admin")
	_ = env.Set("DB_PASSWORD", "secret")
	_ = env.Set("FEATURE_A", "true")
	_ = env.Set("FEATURE_B", "false")

	var cfg Config
	err := env.Parse(&cfg)
	if err != nil {
		panic(err)
	}

	fmt.Printf("Config: %+v\n", cfg)
}

高级功能

1. 自定义解析器

package main

import (
	"fmt"
	"github.com/nasermirzaei89/env"
	"strings"
)

type CommaSeparatedList []string

func (l *CommaSeparatedList) UnmarshalText(text []byte) error {
	*l = strings.Split(string(text), ",")
	return nil
}

type Config struct {
	AllowedHosts CommaSeparatedList `env:"ALLOWED_HOSTS"`
}

func main() {
	_ = env.Set("ALLOWED_HOSTS", "example.com,api.example.com,localhost")

	var cfg Config
	err := env.Parse(&cfg)
	if err != nil {
		panic(err)
	}

	fmt.Printf("Allowed Hosts: %v\n", cfg.AllowedHosts)
}

2. 必填字段验证

package main

import (
	"fmt"
	"github.com/nasermirzaei89/env"
)

type Config struct {
	ApiKey    string `env:"API_KEY,required"`
	ApiSecret string `env:"API_SECRET,required"`
}

func main() {
	// 故意不设置API_SECRET
	_ = env.Set("API_KEY", "12345")

	var cfg Config
	err := env.Parse(&cfg)
	if err != nil {
		fmt.Println("Error:", err) // 会报错: required environment variable "API_SECRET" is not set
	}
}

3. 前缀处理

package main

import (
	"fmt"
	"github.com/nasermirzaei89/env"
)

type Config struct {
	Host string `env:"HOST"`
	Port int    `env:"PORT"`
}

func main() {
	// 设置带前缀的环境变量
	_ = env.Set("MYAPP_HOST", "example.com")
	_ = env.Set("MYAPP_PORT", "8080")

	var cfg Config
	// 使用前缀解析
	err := env.ParseWithPrefix(&cfg, "MYAPP_")
	if err != nil {
		panic(err)
	}

	fmt.Printf("Host: %s, Port: %d\n", cfg.Host, cfg.Port)
}

最佳实践

  1. 集中管理配置:将所有环境变量解析逻辑放在一个地方,通常是程序启动时
  2. 使用结构体:使用结构体来组织配置,比分散的变量更易于管理
  3. 提供默认值:为可选配置提供合理的默认值
  4. 验证必填项:标记必须提供的环境变量
  5. 使用前缀:在大型系统中,为不同组件的环境变量添加前缀避免冲突

与其他库的比较

相比其他环境变量库如godotenvkelseyhightower/envconfignasermirzaei89/env提供了:

  • 更简单的API
  • 内置对基本类型的支持
  • 灵活的自定义解析
  • 前缀处理能力
  • 轻量级实现

这个库特别适合中小型项目,需要简单直接的环境变量管理方案。

回到顶部