✏️
Goでtomlファイルの読み書き
Goでtomlファイルを生成したい場面があったのですが、情報が少なくて手間取ったので備忘録としてまとめます。
以下のライブラリを用います。
tomlファイルの読み込み
基本的にはREADMEの通りです。
例えば次のようなtomlファイルを読み込みたい場合は、
sample.toml
host = "localhost"
port = 5000
以下のような構造体を用意します。
type Config struct {
Host string `toml:"host"`
Port int `toml:"port"`
}
マッピングについてはタグで制御することができます。
toml.DecodeFile
に、ファイルパスと構造体のポインタを渡してあげることで、tomlファイルの中身を読み取ることができます。
main.go
package main
import "github.com/BurntSushi/toml"
type Config struct {
Host string `toml:"host"`
Port int `toml:"port"`
}
func main() {
var conf Config
_, err := toml.DecodeFile("./sample.toml", &conf)
if err != nil {
panic(err)
}
}
このようなテーブル付きのtomlファイルを読み込みたい場合は、
sample.toml
[alpha]
host = "localhost"
port = 5000
以下のようにstringをkey、中身をvalueに持つMapを用意して渡しましょう。
m := map[string]Config{}
_, err := toml.DecodeFile("./sample.toml", &m)
tomlファイルの書き込み
ファイルパスを指定してtoml.Encoder
を初期化し、値を詰めた構造体をEncoder.Encode
に渡します。
privateなフィールドは出力されない点に注意してください。また構造体自体もpublicに定義しておかないと出力してくれないようです。
publicなフィールドを書き込むとtomlファイルでも1文字目が大文字になってしまうので、小文字にしたい場合はタグで調整しましょう。
main.go
package main
import (
"fmt"
"github.com/BurntSushi/toml"
"os"
)
type Config struct {
Host string `toml:"host"`
Port int
}
func main() {
file, err := os.Create("./sample.toml")
if err != nil {
panic(err)
}
defer file.Close()
config := Config{
Host: "localhost",
Port: 8080,
}
configMap := map[string]Config{"alpha": config}
err = toml.NewEncoder(file).Encode(configMap)
if err != nil {
panic(err)
}
}
これを実行すると、以下のようなtomlファイルを生成できます。
sample.toml
[alpha]
host = "localhost"
Port = 8080
Discussion