golang环境变量管理助手插件envh的使用

Golang环境变量管理助手插件envh的使用

Envh简介

Envh是一个Golang环境变量管理库,由两部分组成:

  1. Env对象:将环境变量封装在对象中并提供便捷的辅助方法
  2. 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"
  }
}

功能说明

  1. 通过NewEnvTree创建环境变量树,第一个参数是前缀正则表达式,第二个参数是分隔符
  2. 实现Walk方法可以自定义某些字段的设置逻辑
  3. PopulateStruct方法将环境变量自动填充到结构体中
  4. 支持基本数据类型(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提供了以下主要功能:

  1. 简单易用的环境变量读取API
  2. 支持多种数据类型转换
  3. 支持默认值设置
  4. 支持环境变量前缀过滤
  5. 支持从文件加载环境变量
  6. 支持将环境变量映射到结构体

通过envh,你可以更优雅地管理Golang应用中的环境变量配置,特别是在微服务和云原生应用中非常有用。

回到顶部