一款简单,零依赖的库,解析环境变量到结构体.
使用介绍
我们想定义一个结构体,然后自动去获取系统里面的环境变量,再填充到结构体里面的变量,百度了一些,前篇一律都是用的 os 标准库,os.Getenv 或者 viper ,而且也没能实现自动填充环境变量。官方GitHub。
我们本次引入的第三方库就能满足我们的需求,他们还有很多的一些拓展特性,如设置默认值,自定义解析函数,字段必填,字段不能为空,读取后抹掉环境变量,从文件中读取等等功能,十分好用。
使用起来也简单,我们只需要给结构体里面的变量打上 env 的 tag 即可,我们用个官方的简单例子来实现一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
package main
import (
"fmt"
"time"
"github.com/caarlos0/env/v7"
)
type config struct {
Home string `env:"HOME"`
Port int `env:"PORT" envDefault:"3000"`
Password string `env:"PASSWORD,unset"`
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)
}
|
运行后我们会获得以下输出:
1
2
|
$ 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}
|
更多的使用案例,可以移步到 env 官方GitHub。