goで手軽にencoding/json感覚でdotenvと環境変数を使う方法のメモ

以下2つのライブラリを使うと便利

github.com github.com

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のコードはこの記事から拝借しました。

gist