2016-07-28 Thu.
golang での設定記述言語は YAML の他に TOML も人気があるようです。
(2016/7/28 時点)
TOML はdein.vimのプラグイン記述でも使われていますし、
YAML に比べシンプルかつ、toml ライブラリの方が親切そうなので、TOML を使用しています。
使い方
TOML の仕様に沿って記述しますが、簡単な設定であればシンプルに記述できます。
1[API]
2port = 8000
3version = "v1"
4endpoint = "api.example.com"
5debug = true
6
golang のコード側では、コンフィグファイルに対応した struct を定義します。
1package main
2
3import (
4 "fmt"
5 "github.com/BurntSushi/toml"
6)
7
8type Config struct {
9 API APIConfig
10}
11
12type APIConfig struct {
13 Port uint
14 Version string
15 Endpoint string
16 Debug bool
17}
18
19var config Config
20_, err := toml.DecodeFile("config.toml", &config)
21if err != nil {
22 // Error Handling
23}
24
25fmt.Println("port:", config.API.port) //=> 8000
26
toml ファイルに[]
で指定した名称と、代入する構造体のメンバの名称は揃えます。
golang が CamelCase なので toml も CamelCase になります。頭文字は問われないようです。
おおもと(ここでは Config)以下の構造体の名称は TOML 側では記述されません。
Array になるケース
テストケースのリクエストを TOML で書く場合等に Array を使いたくなると思います。
TOML は[[]]
で Array 要素を記述できます。
例として検索を行う API のテストケースを記述すると以下のようになります。
1package test
2
3import (
4 "github.com/BurntSushi/toml"
5)
6
7type TestCases struct {
8 InvalidUserNameCases []RequestParameter
9 InvalidSearchWordCases []RequestParameter
10}
11
12type RequestParameter struct {
13 UserName string `url:"user_name"`
14 SearchWord string `url:"search_word"`
15}
16
17var testCases TestCases
18_, err := toml.DecodeFile("test_cases.toml", &testCases)
19if err != nil {
20 // Error Handling
21}
22
1[[InvalidUserNameCases]]
2userName = "$dollar"
3searchWord = "searchWord"
4
5[[InvalidUserNameCases]]
6userName = "%percent"
7searchWord = "searchWord"
8
9
10[[InvalidSearchWordCases]]
11userName = "user"
12searchWord = ""
13
14[[InvalidSearchWordCases]]
15userName = "user"
16searchWord = "forbiddenWord"
17
基本は上記と同様に、TOML に記載する Array になる要素の名称と、おおもとの構造体のメンバの名称を揃えます。
この際、該当のメンバの型を、各要素の値に対応した構造体の Array にします。
実態は普通の構造体なので、tag 等も普通に使えます。
構造体をクエリストリングに変換するgoogle/go-querystringのurl
タグも正常に動作します。
参考
toml については以下で詳しく説明されています。