env config
env to golang struct
caarlos0/env是一个第三方开源的环境变量库,支持转化成struct
用途
- 将环境变量转化成Go中的Struct的库
- 可以将项目的配置通过环境变量的形式传入
- 之前做过的一个项目中,开发过程中项目的配置都是通过配置文件的方式来读进项目的,但是线上部署的时候是放在K8S中的,所有的配置都是通过环境变量的形式注入的,因此就有来这篇博客。
用法介绍
- struct 中每个变量需要带上env的标签
- 如果是数组,需要设置envSeparator
- 如果设置envExpand标记,则将根据变量的实际值替换字符串中的环境变量(格式${var}或 $var格式),未导出的字段将被忽略。
Example1
package main
import (
"fmt"
"time"
"github.com/caarlos0/env"
)
type config struct {
Home string `env:"HOME"`
Port int `env:"PORT" envDefault:"3000"`
IsProduction bool `env:"PRODUCTION"`
Hosts []string `env:"HOSTS" envSeparator:":"`
Duration time.Duration `env:"DURATION"`
TempFolder string `env:"TEMP_FOLDER" envDefault:"${HOME}/tmp" envExpand:"true"`
}
func main() {
cfg := config{}
if err := env.Parse(&cfg); err != nil {
fmt.Printf("%+v\n", err)
}
fmt.Printf("%+v\n", cfg)
}
- 运行
$ PRODUCTION=true HOSTS="host1:host2:host3" DURATION=1s go run main.go {Home:/your/home Port:3000 IsProduction:true Hosts:[host1 host2 host3] Duration:1s}
进阶一点的Example
- 可以加上 required tag来设置是否不可以为空
package main
import (
"fmt"
"os"
"time"
"github.com/caarlos0/env"
)
type config struct {
Home string `env:"HOME"`
Port int `env:"PORT" envDefault:"3000"`
IsProduction bool `env:"PRODUCTION"`
Hosts []string `env:"HOSTS" envSeparator:":"`
Duration time.Duration `env:"DURATION,required"`
TempFolder string `env:"TEMP_FOLDER" envDefault:"${HOME}/tmp" envExpand:"true"`
}
func main() {
cfg := config{}
if err := env.Parse(&cfg); err != nil {
fmt.Printf("%+v\n", err)
}
fmt.Printf("%+v\n", cfg)
}
func init() {
os.Setenv("PRODUCTION", "true")
os.Setenv("HOSTS", "host1:host2:host3")
}
- 运行结果
go run main.go required environment variable "DURATION" is not set
本作品采用《CC 协议》,转载必须注明作者和本文链接
欢迎大家指正
这个库赞~ 之前都是 viper 拿到,然后解析到 config 结构体上 :sweat_smile: