env config

qinhan發表於2019-09-12

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

相關文章