0Pricing
Go Academy · レッスン

環境変数

環境変数で設定を上書きします

「環境変数」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

環境変数を使う理由

Twelve-Factor Appの方法論では、設定を環境に保存することを推奨しています。環境変数を使うと、ファイルを編集せずに、同じバイナリの動作を開発、ステージング、本番環境で変えられます。

Viperでは、ファイル設定に環境変数を重ねて適用できます。

優先順位

Viperは、優先度の高い順にソースを確認してキーを解決します。

  • 明示的なSetの呼び出し
  • フラグ
  • 環境変数
  • 設定ファイル
  • デフォルト値

つまり、環境変数はファイルの値を上書きしますが、明示的なSetには負けます。

環境変数のサポートを有効にする

viper.AutomaticEnv()を呼び出すと、要求した任意のキーについて環境変数を確認するようViperに指示できます。これにより、viper.GetString("port")はPORT環境変数を確認します。

viper.AutomaticEnv()
port := viper.GetString("port")

プレフィックスの追加

無関係な環境変数との衝突を避けるには、プレフィックスを設定します。

  • viper.SetEnvPrefix("myapp")
  • これでキーportは環境変数MYAPP_PORTに対応します

Viperはキーを大文字に変換し、アンダースコアでプレフィックスを先頭に付けます。

viper.SetEnvPrefix("myapp")
viper.AutomaticEnv()
fmt.Println(viper.GetString("port")) // reads MYAPP_PORT

ネストしたキーの扱い

環境変数にはドットを含められません。キーリプレーサーを使ってドット区切りのキーをアンダースコアに変換すると、server.portはSERVER_PORTになります。

replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
viper.AutomaticEnv()
// server.port -> SERVER_PORT

単一の変数をバインドする

自動モードの代わりに、viper.BindEnvを使って1つのキーを明示的にバインドできます。環境変数名がプレフィックスの規則に従わない場合に便利です。

viper.BindEnv("id", "ACCOUNT_ID")
fmt.Println(viper.GetString("id"))

標準ライブラリのosパッケージ

内部では、これはプロセスの環境から値を読み取ります。標準ライブラリではos.Getenvとos.LookupEnvを通じて利用できます。

  • os.Getenvは、設定されていない場合に空文字列を返します
  • os.LookupEnvは、環境変数が存在するかどうかを示す2番目のbool値を返します
val, ok := os.LookupEnv("PORT")
if !ok {
    val = "8080" // default
}

Goで環境変数を設定する

テストやデフォルト値の設定では、os.Setenvを使ってプログラムから環境変数を設定できます。次の例では、まさにこれを使って上書きの動作を示します。

os.Setenv("MYAPP_PORT", "9090")

空文字列と未設定の違い

空文字列に設定された環境変数も、存在することに注意してください。os.LookupEnvは("", true)を返します。os.Getenvだけを使うと、空文字列と未設定を区別できません。これは、ブール値のようなフラグでは重要です。

os.Setenv("FEATURE", "")
v, ok := os.LookupEnv("FEATURE")
fmt.Println(v == "", ok) // true true

組み合わせる(概念)

一般的な起動フローは、まずファイルを読み込んでデフォルト値を取得し、次にAutomaticEnvを呼び出してデプロイ環境の環境変数を優先するというものです。運用担当者はYAMLに触れずにMYAPP_PORTを変更できます。

viper.SetConfigName("config")
viper.ReadInConfig()
viper.SetEnvPrefix("myapp")
viper.AutomaticEnv()
fmt.Println(viper.GetInt("port"))

実行可能な例:環境変数による上書き

この標準ライブラリだけを使ったプログラムは、ファイルのデフォルト値を環境変数で上書きするという、Viperの優先順位を再現します。

package main

import (
    "fmt"
    "os"
)

func get(key, fileDefault string) string {
    if v, ok := os.LookupEnv(key); ok {
        return v
    }
    return fileDefault
}

func main() {
    os.Setenv("PORT", "9090")
    fmt.Println("port:", get("PORT", "8080"))
    fmt.Println("host:", get("HOST", "localhost"))
}

クイックチェック

環境変数による設定について理解度を確認しましょう。

まとめ

環境変数で設定を上書きする方法を学びました。

  • Viperの優先順位では、環境変数はファイルより上位に位置します
  • AutomaticEnvとSetEnvPrefixで、キーをPREFIX_KEYに対応付けます
  • ドット区切りのネストしたキーにはSetEnvKeyReplacerを使用します
  • 標準ライブラリではos.Getenv / os.LookupEnvがこの機能を支えています

よくある質問

「環境変数」レッスンは無料ですか?

はい。「環境変数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「環境変数」で何を学びますか?

環境変数で設定を上書きします ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「環境変数」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 設定ファイルの読み込み
  2. 環境変数
  3. デフォルト値と監視
  4. 構造体へのバインディング
← Go Academyに戻る