4
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

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オブジェクトを保有しておくなり、
ロード関数を作って毎回読み出すなり色々工夫してみて下さい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
4
Help us understand the problem. What are the problem?