「Go开源包」Env:一个将系统环境变量解析到结构体的库

开发 前端
如果你要解析的数据类型不是go内置的数据类型,那么你也可以通过自定义类型解析函数来进行解析。下面示例演示了如何将环境变量的值映射到自定一的MyTime类型字段上。

大家好,我是渔夫子。

今天给大家推荐一个将系统的环境变量获取并解析到结构体的包:env。

项目地址:https://github.com/caarlos0/envstar:3.7k    贡献者:54   使用者:1.8k

该包的实现是基于标准库os/env包中的相关函数(比如Getenv�)来获取系统的环境变量的。获取到环境变量值后,再通过结构体中的tag,将值映射到对应的结构体字段上。

使用示例

下面是将系统的一些环境变量映射到config结构体的示例。如下:

package main

import (
 "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包支持的数据类型如下:

  • string
  • bool
  • int
  • int8
  • int16
  • int32
  • int64
  • uint
  • uint8
  • uint16
  • uint32
  • uint64
  • float32
  • float64
  • time.Duration
  • encoding.TextUnmarshaler
  • url.URL

当然,指针、切片、指针切片以及map这些数据类型也支持。同时,该包还支持通过自定义类型解析函数来支持自定义的数据类型。

自定义类型解析函数

如果你要解析的数据类型不是go内置的数据类型,那么你也可以通过自定义类型解析函数来进行解析。下面示例演示了如何将环境变量的值映射到自定一的MyTime类型字段上。如下:

type MyTime time.Time

func (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 main

import (
 "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学堂
相关推荐

2010-04-20 14:43:01

Unix操作系统

2023-11-01 13:40:25

GolangGo

2021-04-10 10:42:02

.envNodeJS环境变量

2011-04-19 10:14:13

Linux命令

2023-06-14 08:02:54

函数代码概率

2010-04-27 18:30:42

AIX系统

2022-09-19 08:07:28

Goweb 程序

2011-07-12 16:07:42

OracleToad环境变量

2012-10-15 14:14:21

Windows

2009-06-15 16:28:30

JAVA环境变量

2011-05-31 13:41:50

Android 环境变量

2011-08-22 15:06:19

linux环境变量

2010-04-30 01:35:46

Unix系统

2010-04-06 12:45:28

CentOS系统

2012-07-30 09:40:52

Lua

2021-02-15 15:52:27

Linux环境变量命令

2010-03-26 12:50:02

CentOS系统

2020-12-02 09:10:22

Go结构数据类型

2012-09-18 01:22:33

Java环境变量Classpath

2017-03-07 19:30:54

Windows 7Windowsjava
点赞
收藏

51CTO技术栈公众号