env to golang struct
caarlos0/env是一個第三方開源的環境變數庫,支援轉化成struct
用途
- 將環境變數轉化成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