✏️

Goでtomlファイルの読み書き

2023/03/04に公開

Goでtomlファイルを生成したい場面があったのですが、情報が少なくて手間取ったので備忘録としてまとめます。

以下のライブラリを用います。

https://github.com/BurntSushi/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