LoginSignup
12
5

More than 3 years have passed since last update.

Go言語のアプリケーション設定・環境変数をStructにまとめる

Last updated at Posted at 2019-08-07

Go言語で環境変数を読み出す

Go言語では標準パッケージから簡単に環境変数を読み出すことができます。

fmt.Println(os.Getenv("HOME"))

しかし、往々にして環境変数がないときのデフォルトを設定する事があります。
その場合はこのように書きますが、これを環境変数分用意するのはなかなか骨が折れます。

home := os.Getenv("HOME")
if home == "" {
  home = "/home/default/place"
}
fmt.Println(home)

caarlos0/envを使ってStructに読み出す

そこで活躍するのが env というライブラリです。
環境変数から読み出したい情報はStructにまとめておき、tagに情報を付与することで
デフォルト値の設定や必須設定等を行えます。

また、読み出し先のStructを定義しているだけなので、
定義するStructに他のアプリケーション設定を足したり、
メソッドを生やしたりすることも勿論できます。


package main

import (
    "fmt"

    "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:":"` // 配列も読める
    SecretKey    string   `env:"SECRET_KEY,required"` // 必須設定も可
    Notag        string   // タグ無しにすれば環境変数のない設定も同居できる
}

func main() {
    cfg := Config{}
    env.Parse(&cfg) // パースすると環境変数から値が読み出される
    fmt.Println(cfg)
}

多分実用する段階であればmainパッケージに置くことはないと思うので、
configパッケージにシングルトンでConfigオブジェクトを保有しておくなり、
ロード関数を作って毎回読み出すなり色々工夫してみて下さい。

12
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
5