設定ファイルの読み込み
YAML、JSON、TOMLを読み込みます
「設定ファイルの読み込み」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
設定はコードの外に置く
ポート、ホスト名、タイムアウトなどの値をGoプログラムにハードコーディングすると、壊れやすくなります。ViperはGoでデファクトスタンダードとなっている設定ライブラリです。ファイル、環境変数、フラグ、リモートストアから設定を読み取れます。
このレッスンでは、ディスク上のファイルから設定を読み込みます。
Viperが読み取る形式
Viperは、標準で多くの形式をサポートしています。
- YAML(
.yaml/.yml) - JSON(
.json) - TOML(
.toml) - HCL、INI、Java propertiesファイル
形式はSetConfigTypeで指定するか、Viperにファイル拡張子から推測させます。
Viperのインストールとインポート
モジュールにViperを追加してインポートします。
go get github.com/spf13/viperimport "github.com/spf13/viper"
Viperは外部依存関係であるため、Viperをインポートするスニペットは、このレッスンプレーヤーでは実行できません。可能な箇所では、標準ライブラリを使って動作をシミュレートします。
import "github.com/spf13/viper"Viperに検索場所を指定する
読み込む前に、ファイル名、形式、検索パスを設定します。
viper.SetConfigName("config")でベース名(拡張子なし)を設定しますviper.SetConfigType("yaml")で形式を設定しますviper.AddConfigPath(".")で検索対象のディレクトリを追加します
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
viper.AddConfigPath("/etc/myapp")ファイルの読み込み
viper.ReadInConfig()を呼び出してファイルを読み込みます。エラーが返されるため、確認する必要があります。
- ファイルが存在しない場合は
ConfigFileNotFoundErrorが返されます - ファイルの形式が正しくない場合はパースエラーが返されます
if err := viper.ReadInConfig(); err != nil {
log.Fatalf("failed to read config: %v", err)
}YAML設定の例
次のようなconfig.yamlを考えてみましょう。Viperはネストしたキーをドットでフラット化するため、ポートはserver.portになります。
server:
port: 8080
host: "localhost"
debug: true型付きの値を取得する
Viperには型付きのゲッターが用意されているため、手動で変換する必要がありません。
viper.GetInt("server.port")viper.GetString("server.host")viper.GetBool("debug")
port := viper.GetInt("server.port")
host := viper.GetString("server.host")
debug := viper.GetBool("debug")
fmt.Println(host, port, debug)JSONでも同じように動作する
JSONに切り替える際に変更するのは、ファイルの内容と設定形式だけです。同じキーのパスとゲッターを使用できます。この移植性がViperが広く使われている理由です。運用担当者がどの形式を選んでも、コードはその違いを意識する必要がありません。
{
"server": { "port": 8080, "host": "localhost" },
"debug": true
}TOMLもサポートされる
TOMLはGoエコシステムでよく使われています(多くのCLIが使用しています)。同じネストしたキーがドット区切りのパスに対応します。
[server]
port = 8080
host = "localhost"
debug = true標準ライブラリでJSONをパースする
実際に動作する形で考え方を確認するため、ここではViperを使わず、encoding/jsonだけを使ってJSON設定をマップに読み込む、純粋なGoの例を示します(Viper自体も内部では汎用マップを使って動作します)。
package main
import (
"encoding/json"
"fmt"
)
func main() {
raw := "{\"port\":8080,\"host\":\"localhost\"}"
var c map[string]any
if err := json.Unmarshal([]byte(raw), &c); err != nil {
panic(err)
}
fmt.Printf("%v:%v\n", c["host"], c["port"])
}実行可能な例:マップへの読み込み
この自己完結型プログラムは、JSON設定を汎用マップにパースして値を出力します。JSONに対してViperが内部で行っている処理を再現しています。
package main
import (
"encoding/json"
"fmt"
)
func main() {
raw := "{\"port\":8080,\"host\":\"localhost\"}"
var m map[string]any
json.Unmarshal([]byte(raw), &m)
fmt.Println("host:", m["host"])
fmt.Println("port:", m["port"])
}クイックチェック
Viperを使った設定ファイルの読み込みについて理解度を確認しましょう。
まとめ
Viperによる設定ファイルの読み込みについて学びました。
- YAML、JSON、TOMLを透過的にサポートします
SetConfigName、SetConfigType、AddConfigPathで設定しますReadInConfig()でファイルを読み込み、エラーを返しますGetIntやGetStringなどの型付きゲッターで、ドット区切りのキーから値を読み取ります
次は、環境変数で設定を上書きします。
よくある質問
「設定ファイルの読み込み」レッスンは無料ですか?
はい。「設定ファイルの読み込み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「設定ファイルの読み込み」で何を学びますか?
YAML、JSON、TOMLを読み込みます ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「設定ファイルの読み込み」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 設定ファイルの読み込み
- 環境変数
- デフォルト値と監視
- 構造体へのバインディング