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)
}
最佳实践
- 集中管理配置:将所有环境变量解析逻辑放在一个地方,通常是程序启动时
- 使用结构体:使用结构体来组织配置,比分散的变量更易于管理
- 提供默认值:为可选配置提供合理的默认值
- 验证必填项:标记必须提供的环境变量
- 使用前缀:在大型系统中,为不同组件的环境变量添加前缀避免冲突
与其他库的比较
相比其他环境变量库如godotenv
或kelseyhightower/envconfig
,nasermirzaei89/env
提供了:
- 更简单的API
- 内置对基本类型的支持
- 灵活的自定义解析
- 前缀处理能力
- 轻量级实现
这个库特别适合中小型项目,需要简单直接的环境变量管理方案。