[golangノート] プロジェクトの環境変数を設定する方法

作成者:カランカラン
💡

質問やフィードバックがありましたら、フォームからお願いします

本文は台湾華語で、ChatGPT で翻訳している記事なので、不確かな部分や間違いがあるかもしれません。ご了承ください

前言

プロジェクトを開発しているときは、異なる環境に切り替える必要がよくあります。そのため、通常は異なる環境変数を設定します。しかし、プログラムに直接値をハードコーディングすると、毎回の修正が非常に面倒です。環境変数を動的に渡すことができれば、不要な修正を大幅に減らし、プログラムも比較的クリーンに保つことができます。

flag

一般的に、Golangでは flag パッケージを利用して似たような効果を得ることができます。例えば:

var env string
var accessToken string
func main() {
    flag.StringVar(&env, 'ENV', 'development', 'your current env')
    flag.StringVar(&accessToken, 'ACCESS_TOKEN', 'xxx-oo-ooo', 'your API access token')
    flag.Parse()

    // start your application
}

また、こちらの記事で触れられているように、go build -ldflag を使用してコンパイル時に変数を設定することもできます。

この方法では確かに値をプログラム内にハードコーディングする必要がありませんが、変数は事前に定義しておく必要があります。

YAMLを通じた読み込み

上述の問題を解決するために、yaml(またはお好みのフォーマット)を使用して環境変数を一元管理することができます。例えば:

func LoadEnv(filename string) bool {
    file, err := ioutil.ReadFile(filename)
    if err != nil {
        // プロダクション環境では、コンソールを使って環境変数を設定することがある
        return false
    }

    var config := make(map[string]string)
    yaml.Unmarshal(file, &config)
    for k, v := range config {
        os.Setenv(k, v)
    }
}

yaml内の変数を読み込んだ後、os.Setenv(k, v) を使用して一元的に保存します。これにより、ローカル環境で変数を簡単に調整できるようになります。設定ファイルは必ず無視リストに入れてください。そうしないと、変数に敏感な情報が含まれている場合、パブリックリポジトリで見られてしまうことになります。

後記

この作業のために、かなりシンプルな repo を作成しました。もし開発に本当に必要であれば、さらに最適化していきましょう XD

この記事が役に立ったと思ったら、下のリンクからコーヒーを奢ってくれると嬉しいです ☕ 私の普通の一日が輝かしいものになります ✨

Buy me a coffee