# GO第三方库-env


一款简单，零依赖的库，解析环境变量到结构体.

<!--more-->

## 使用介绍

> 我们想定义一个结构体，然后自动去获取系统里面的环境变量，再填充到结构体里面的变量，百度了一些，前篇一律都是用的 os 标准库，os.Getenv 或者 viper ，而且也没能实现自动填充环境变量。[官方GitHub](https://github.com/caarlos0/env)。

我们本次引入的第三方库就能满足我们的需求，他们还有很多的一些拓展特性，如设置默认值，自定义解析函数，字段必填，字段不能为空，读取后抹掉环境变量，从文件中读取等等功能，十分好用。

使用起来也简单，我们只需要给结构体里面的变量打上 env 的 tag 即可，我们用个官方的简单例子来实现一下：

```golang
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)
}
```
运行后我们会获得以下输出：

```bash
$ 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。
