env config

env to golang struct

caarlos0/env是一个第三方开源的环境变量库,支持转化成struct

Github:https://github.com/caarlos0/env

官方文档:https://godoc.org/github.com/caarlos0/env

用途

  • 将环境变量转化成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 协议》,转载必须注明作者和本文链接
qinhan
讨论数量: 2
qinhan

欢迎大家指正

4年前 评论

这个库赞~ 之前都是 viper 拿到,然后解析到 config 结构体上 :sweat_smile:

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!