大家好,系统我是环境渔夫子。
今天给大家推荐一个将系统的解析环境变量获取并解析到结构体的包:env。
项目地址:https://github.com/caarlos0/envstar:3.7k 贡献者:54 使用者:1.8k
该包的到结的库实现是基于标准库os/env包中的相关函数(比如Getenv�)来获取系统的环境变量的。获取到环境变量值后,开源再通过结构体中的包E变量tag,将值映射到对应的个将构体结构体字段上。
下面是系统将系统的一些环境变量映射到config结构体的示例。如下:
package mainimport ( "fmt" "time" "github.com/caarlos0/env/v9")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,expand" envDefault:"${ HOME}/tmp"`}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}
从上述示例中我们看到config结构体中的字段有不同的类型。也就是解析说可以将环境变量解析成不同的数据类型。
接下来,到结的库我们看看env包都支持哪些数据类型。开源
env包支持的数据类型如下:
当然,指针、切片、指针切片以及map这些数据类型也支持。同时,该包还支持通过自定义类型解析函数来支持自定义的数据类型。
如果你要解析的数据类型不是go内置的数据类型,那么你也可以通过自定义类型解析函数来进行解析。下面示例演示了如何将环境变量的值映射到自定一的MyTime类型字段上。如下:
type MyTime time.Timefunc (t *MyTime) UnmarshalText(text []byte) error { tt, err := time.Parse("2006-01-02", string(text)) *t = MyTime(tt) return err}type Config struct { SomeTime MyTime `env:"SOME_TIME"`}
我们定义了一个MyTime类型,同时给这个类型定义了一个UnmarshalText方法。这样,在Config结构体中就可以将SOME_TIME的环境变量值解析到Config的SomeTime字段上。
env包通过给结构体字段设置file标签就可以支持从文件中解析环境变量到结构体上。如下:
package mainimport ( "fmt" "time" "github.com/caarlos0/env/v9")type config struct { Secret string `env:"SECRET,file"` Password string `env:"PASSWORD,file" envDefault:"/tmp/password"` Certificate string `env:"CERTIFICATE,file,expand" envDefault:"${ CERTIFICATE_FILE}"`}func main() { cfg := config{ } if err := env.Parse(&cfg); err != nil { fmt.Printf("%+v\n", err) } fmt.Printf("%+v\n", cfg)}
可以通过以下方式运行:
$ echo qwerty > /tmp/secret$ echo dvorak > /tmp/password$ echo coleman > /tmp/certificate$ SECRET=/tmp/secret \ CERTIFICATE_FILE=/tmp/certificate \ go run main.go{ Secret:qwerty Password:dvorak Certificate:coleman}
如果需要了解更多该包的用处,请参考github上的官方文档:https://github.com/caarlos0/env
责任编辑:武晓燕 来源: Go学堂 结构体库Env(责任编辑:焦点)
2900点关前缩量震荡 机构称当前市场价值凸显 适宜做好配置