Goでマルチドキュメントのyamlを読み込む方法

Goでマルチドキュメントのyamlを読み込む方法

October 31, 2019
Programming
golang, yaml

Go 言語でマルチドキュメントの yaml を取り扱いたい. 具体的には kubernetes のマニフェストを読み込んでごにょごにょしたかった

マルチドキュメント yaml

---
test: 1
sample: hoge
---
test: 2
sample: hogehoge
---
test: 3
foo: foo

こういうハイフン区切りになっている yaml ファイル

実際のコード

package main

import (
	"fmt"
	"gopkg.in/yaml.v2"
	"os"
)

func main() {
	f, err := os.Open("test.yml")
	if err != nil {
		return
	}
	defer f.Close()

	dec := yaml.NewDecoder(f)

	var tmp map[interface{}]interface{}
	for(dec.Decode(&tmp)) == nil {
		fmt.Printf("%v\n", tmp)
		// 1つ前のドキュメントとキー名が被っていないのは引き継がれてしまうので、一度初期化
		tmp = nil
	}
}
---
test: 1
sample: 2
---
hoge: foo
mo: true
hogehoge:
  hoge: 2
  fuga: 3
---
hoge: hoge
mo: false
hogehoge:
  sample: mooooo
  fuga: 3

出力結果

map[sample:2 test:1]
map[hoge:foo hogehoge:map[fuga:3 hoge:2] mo:true]
map[hoge:hoge hogehoge:map[fuga:3 sample:mooooo] mo:false]

ちなみに, for の中での tmp = nilをしないと以下のように 1 つ前のドキュメントの内容が残ってしまいます。

map[sample:2 test:1]
map[hoge:foo hogehoge:map[fuga:3 hoge:2] mo:true sample:2 test:1]
map[hoge:hoge hogehoge:map[fuga:3 sample:mooooo] mo:false sample:2 test:1]

参考