goで手軽にencoding/json感覚でdotenvと環境変数を使う方法のメモ
以下2つのライブラリを使うと便利
joho/godotenvは、いわゆる.envファイルをいい感じに読み込んでくれるもの。 caarlos0/envは、encoding/json感覚で書いたstructのタグからいい感じに読み込んでくれるもの。
利用例
例えば、以下の様なConfigを用意する。
type GitHubConfig struct { Username string `env:"GITHUB_USERNAME"` APIKey string `env:"GITHUB_API_KEY"` } type Config struct { GitHub GitHubConfig DebugMode bool `env:"DEBUG_MODE"` UserRoles []string `env:"USER_ROLES"` MaxUsers int `env:"MAX_USERS"`
これをこんな感じで使う。
package main import ( "fmt" "log" "github.com/caarlos0/env/v6" "github.com/joho/godotenv" ) func main() { // loads values from .env into the system if err := godotenv.Load(); err != nil { log.Print("No .env file found") } var conf Config if err := env.Parse(&conf); err != nil { panic(err) } // Print out environment variables fmt.Println(conf.GitHub.Username) fmt.Println(conf.GitHub.APIKey) fmt.Println(conf.DebugMode) fmt.Println(conf.MaxUsers) // Print out each role for _, role := range conf.UserRoles { fmt.Println(" ", role) } }
結果。
$ go run main.go 2020/06/16 23:06:44 No .env file found false 0
.env
.envを追加してみる。
GITHUB_USERNAME=craicoverflow GITHUB_API_KEY=TCtQrZizM1xeo1v92lsVfLOHDsF7TfT5lMvwSno MAX_USERS=10 USER_ROLES=admin,super_admin,guest DEBUG_MODE=false
今度は環境変数を読み込んでくれる様になった。
$ go run main.go craicoverflow TCtQrZizM1xeo1v92lsVfLOHDsF7TfT5lMvwSno false 10 admin super_admin guest
環境変数で渡したものは優先される。
$ DEBUG_MODE=true go run main.go go run 03dotenv/main.go craicoverflow TCtQrZizM1xeo1v92lsVfLOHDsF7TfT5lMvwSno true 10 admin super_admin guest
便利ですね。
参考
configのコードはこの記事から拝借しました。