golang环境变量管理助手插件envh的使用
Golang环境变量管理助手插件envh的使用
Envh简介
Envh是一个Golang环境变量管理库,由两部分组成:
- Env对象:将环境变量封装在对象中并提供便捷的辅助方法
- Env树对象:通过树结构管理环境变量,可以像YAML文件那样分层存储配置
安装
go get github.com/antham/envh
使用示例
下面是一个完整的示例,展示如何使用envh将环境变量映射到结构体:
package main
import (
"encoding/json"
"fmt"
"os"
"strings"
"github.com/antham/envh"
)
type CONFIG2 struct {
DB struct {
USERNAME string
PASSWORD string
HOST string
NAME string
PORT int
URL string
USAGELIMIT float32
}
MAILER struct {
HOST string
USERNAME string
PASSWORD string
ENABLED bool
}
MAP map[string]string
}
// Walk方法实现自定义字段设置
func (c *CONFIG2) Walk(tree *envh.EnvTree, keyChain []string) (bool, error) {
if setter, ok := map[string]func(*envh.EnvTree, []string) error{
"CONFIG2_DB_URL": c.setURL,
"CONFIG2_MAP": c.setMap,
}[strings.Join(keyChain, "_")]; ok {
return true, setter(tree, keyChain)
}
return false, nil
}
// 设置MAP字段
func (c *CONFIG2) setMap(tree *envh.EnvTree, keyChain []string) error {
datas := map[string]string{}
keys, err := tree.FindChildrenKeys(keyChain...)
if err != nil {
return err
}
for _, key := range keys {
value, err := tree.FindString(append(keyChain, key)...)
if err != nil {
return err
}
datas[key] = value
}
c.MAP = datas
return nil
}
// 设置DB.URL字段
func (c *CONFIG2) setURL(tree *envh.EnvTree, keyChain []string) error {
datas := map[string]string{}
for _, key := range []string{"USERNAME", "PASSWORD", "HOST", "NAME"} {
value, err := tree.FindString("CONFIG2", "DB", key)
if err != nil {
return err
}
datas[key] = value
}
port, err := tree.FindInt("CONFIG2", "DB", "PORT")
if err != nil {
return err
}
c.DB.URL = fmt.Sprintf("jdbc:mysql://%s:%d/%s?user=%s&password=%s",
datas["HOST"], port, datas["NAME"], datas["USERNAME"], datas["PASSWORD"])
return nil
}
func main() {
// 清空并设置环境变量
os.Clearenv()
setEnv("CONFIG2_DB_USERNAME", "foo")
setEnv("CONFIG2_DB_PASSWORD", "bar")
setEnv("CONFIG2_DB_HOST", "localhost")
setEnv("CONFIG2_DB_NAME", "my-db")
setEnv("CONFIG2_DB_PORT", "3306")
setEnv("CONFIG2_DB_USAGELIMIT", "95.6")
setEnv("CONFIG2_MAILER_HOST", "127.0.0.1")
setEnv("CONFIG2_MAILER_USERNAME", "foo")
setEnv("CONFIG2_MAILER_PASSWORD", "bar")
setEnv("CONFIG2_MAILER_ENABLED", "true")
setEnv("CONFIG2_MAP_KEY1", "value1")
setEnv("CONFIG2_MAP_KEY2", "value2")
setEnv("CONFIG2_MAP_KEY3", "value3")
// 创建EnvTree实例
env, err := envh.NewEnvTree("^CONFIG2", "_")
if err != nil {
panic(err)
}
// 创建配置结构体
s := CONFIG2{}
// 将环境变量填充到结构体
err = env.PopulateStruct(&s)
if err != nil {
panic(err)
}
// 输出JSON格式的配置
b, err := json.Marshal(s)
if err != nil {
panic(err)
}
fmt.Println(string(b))
}
// 辅助函数:设置环境变量
func setEnv(key, value string) {
if err := os.Setenv(key, value); err != nil {
panic(err)
}
}
输出结果:
{
"DB": {
"USERNAME": "foo",
"PASSWORD": "bar",
"HOST": "localhost",
"NAME": "my-db",
"PORT": 3306,
"URL": "jdbc:mysql://localhost:3306/my-db?user=foo&password=bar",
"USAGELIMIT": 95.6
},
"MAILER": {
"HOST": "127.0.0.1",
"USERNAME": "foo",
"PASSWORD": "bar",
"ENABLED": true
},
"MAP": {
"KEY1": "value1",
"KEY2": "value2",
"KEY3": "value3"
}
}
功能说明
- 通过
NewEnvTree
创建环境变量树,第一个参数是前缀正则表达式,第二个参数是分隔符 - 实现
Walk
方法可以自定义某些字段的设置逻辑 PopulateStruct
方法将环境变量自动填充到结构体中- 支持基本数据类型(string, int, bool, float32等)和map类型的自动转换
这个示例展示了如何使用envh库将环境变量映射到结构体,包括自定义字段设置和自动类型转换等功能。
更多关于golang环境变量管理助手插件envh的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang环境变量管理助手插件envh的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang环境变量管理助手envh使用指南
envh是一个轻量级的Golang环境变量管理库,它提供了简单易用的API来读取和管理环境变量。下面我将详细介绍envh的使用方法。
安装envh
首先使用go get安装envh:
go get github.com/antham/envh
基本使用方法
1. 简单读取环境变量
package main
import (
"fmt"
"github.com/antham/envh"
)
func main() {
// 创建一个新的envh实例
env := envh.NewEnv()
// 读取环境变量
value, found := env.GetString("HOME")
if found {
fmt.Printf("HOME目录是: %s\n", value)
} else {
fmt.Println("HOME环境变量未设置")
}
}
2. 读取不同类型的环境变量
envh支持读取多种类型的环境变量:
func readDifferentTypes(env *envh.Env) {
// 读取字符串
strVal, _ := env.GetString("STRING_VAR")
// 读取整数
intVal, _ := env.GetInt("INT_VAR")
// 读取布尔值
boolVal, _ := env.GetBool("BOOL_VAR")
// 读取浮点数
floatVal, _ := env.GetFloat("FLOAT_VAR")
// 读取字符串数组
arrayVal, _ := env.GetStringArray("ARRAY_VAR", ",") // 使用逗号分隔
fmt.Printf("字符串: %s, 整数: %d, 布尔: %t, 浮点: %f, 数组: %v\n",
strVal, intVal, boolVal, floatVal, arrayVal)
}
3. 设置默认值
func withDefaultValues(env *envh.Env) {
// 如果环境变量不存在,使用默认值
port := env.GetStringDefault("PORT", "8080")
debug := env.GetBoolDefault("DEBUG", false)
fmt.Printf("端口: %s, 调试模式: %t\n", port, debug)
}
高级功能
1. 使用前缀过滤环境变量
func withPrefix(env *envh.Env) {
// 只获取以"APP_"开头的环境变量
subEnv := env.SubTree("APP_")
dbHost, _ := subEnv.GetString("DB_HOST")
dbPort, _ := subEnv.GetInt("DB_PORT")
fmt.Printf("数据库配置: %s:%d\n", dbHost, dbPort)
}
2. 从文件加载环境变量
func fromFile() {
// 从.env文件加载环境变量
env, err := envh.NewEnvFromFile(".env")
if err != nil {
panic(err)
}
apiKey, _ := env.GetString("API_KEY")
fmt.Println("API密钥:", apiKey)
}
3. 结构化配置
type Config struct {
Database struct {
Host string
Port int
Username string
Password string
}
Server struct {
Port int
}
}
func unmarshalConfig(env *envh.Env) {
var config Config
// 将环境变量映射到结构体
err := env.Unmarshal(&config)
if err != nil {
panic(err)
}
fmt.Printf("数据库配置: %s:%d\n", config.Database.Host, config.Database.Port)
fmt.Printf("服务器端口: %d\n", config.Server.Port)
}
实际应用示例
package main
import (
"fmt"
"log"
"os"
"github.com/antham/envh"
)
func main() {
// 设置一些测试环境变量
os.Setenv("APP_DB_HOST", "localhost")
os.Setenv("APP_DB_PORT", "5432")
os.Setenv("APP_SERVER_PORT", "8080")
os.Setenv("APP_DEBUG", "true")
// 创建envh实例
env := envh.NewEnv()
// 只处理APP_开头的变量
appEnv := env.SubTree("APP_")
// 读取配置
config := struct {
DB struct {
Host string `envh:"DB_HOST"`
Port int `envh:"DB_PORT"`
}
Server struct {
Port int `envh:"SERVER_PORT"`
Debug bool `envh:"DEBUG"`
}
}{}
err := appEnv.Unmarshal(&config)
if err != nil {
log.Fatalf("配置解析失败: %v", err)
}
fmt.Printf("数据库配置: %s:%d\n", config.DB.Host, config.DB.Port)
fmt.Printf("服务器配置: 端口%d, 调试模式:%t\n",
config.Server.Port, config.Server.Debug)
}
总结
envh提供了以下主要功能:
- 简单易用的环境变量读取API
- 支持多种数据类型转换
- 支持默认值设置
- 支持环境变量前缀过滤
- 支持从文件加载环境变量
- 支持将环境变量映射到结构体
通过envh,你可以更优雅地管理Golang应用中的环境变量配置,特别是在微服务和云原生应用中非常有用。