デフォルト値と監視
デフォルト値を設定してホットリロードします
「デフォルト値と監視」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 設定ファイルの読み込み
- 環境変数
- デフォルト値と監視
- 構造体へのバインディング