0Pricing
Go Academy · レッスン

デフォルト値と監視

デフォルト値を設定してホットリロードします

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

適切なデフォルト値

優れた設定システムは、何も設定されていない場合でも動作します。デフォルト値によってすべてのキーに代替値を用意できるため、値がないことでプログラムがクラッシュすることはありません。

ViperではSetDefaultを使ってデフォルト値を設定でき、優先順位の最下位に位置します。

デフォルト値の設定

ファイルを読み込む前にデフォルト値を登録します。どのソース(ファイル、環境変数、フラグ)からの値でも、デフォルト値を上書きします。

viper.SetDefault("port", 8080)
viper.SetDefault("logLevel", "info")
fmt.Println(viper.GetInt("port"))

デフォルト値が役立つ理由

デフォルト値を使うと設定ファイルを小さくできます。運用担当者は標準と異なる部分だけを上書きすればよいからです。また、コード内で設定の想定される構造を直接文書化する役割も果たします。

WatchConfigによるホットリロード

再起動せずに設定変更を反映したい場合があります。viper.WatchConfig()はfsnotifyを使ってファイルの変更を監視します。

viper.WatchConfig()

変更への対応

ファイルが変更されたときに実行するコールバックを登録します。

viper.OnConfigChange(func(e fsnotify.Event) {
    fmt.Println("config changed:", e.Name)
})
viper.WatchConfig()

ホットリロードに適したもの

ホットリロードは、実行中に安全に変更できる値に適しています。

  • ログの詳細度
  • フィーチャーフラグ
  • レート制限

リッスンポートやデータベースDSNなど、通常は再起動が必要なものはホットリロードしないでください。

スレッドセーフティに関する注意

実行時に設定を変更できる場合、複数のgoroutineが設定を読み取る可能性があります。Viperのゲッターは並行して安全に呼び出せますが、値を独自の変数にキャッシュする場合は、ミューテックスまたはアトミック値で保護してください。

var cfg atomic.Value // stores a Config struct
cfg.Store(loadConfig())

Viperを使わずにデフォルト値を表現する

同じデフォルト値の考え方を、純粋なGoで表現できます。値が存在すればその値を、存在しなければ代替値を返す関数を作成します。

func intOr(m map[string]int, key string, def int) int {
    if v, ok := m[key]; ok {
        return v
    }
    return def
}

リロード後のバリデーション

リロード後は、適用する前に必ずバリデーションを行ってください。ファイルのタイプミスがあった場合は、実行中のサービスをクラッシュさせるのではなく、以前の正常な設定を維持すべきです。エラーをログに記録し、サービスの提供を続けてください。

newCfg, err := load()
if err != nil {
    log.Println("bad config, keeping current:", err)
    return
}
current.Store(newCfg)

リロードをシミュレートする

概念的には、リロードとはソースを再読み込みして、アクティブな設定を入れ替えることです。ウォッチャーは、ファイルのmtimeが変化したときにこの入れ替えを開始します。次の実行可能なデモでは、値が変化する様子を確認できます。

実行可能な例:デフォルト値とリロード

この自己完結型プログラムでは、デフォルト値の処理と、値を変更するシミュレートされたリロードを示します。

package main

import "fmt"

func get(m map[string]int, k string, def int) int {
    if v, ok := m[k]; ok {
        return v
    }
    return def
}

func main() {
    cfg := map[string]int{}
    fmt.Println("port (default):", get(cfg, "port", 8080))
    cfg["port"] = 9090 // simulated reload
    fmt.Println("port (reloaded):", get(cfg, "port", 8080))
}

クイックチェック

デフォルト値と監視について理解度を確認しましょう。

まとめ

デフォルト値とホットリロードについて学びました。

  • SetDefaultは、最も低い優先順位で代替値を提供します
  • WatchConfigとOnConfigChangeでライブリロードを実現できます
  • 実行時に安全に変更できる値だけをホットリロードします
  • キャッシュした設定をアトミック値やミューテックスで保護し、適用前にバリデーションを行います

よくある質問

「デフォルト値と監視」レッスンは無料ですか?

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

「デフォルト値と監視」で何を学びますか?

デフォルト値を設定してホットリロードします ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「デフォルト値と監視」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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