Goでマルチドキュメントのyamlを読み込む方法
October 31, 2019
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]