いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-295 (一つのYAMLファイル内に複数ドキュメントある場合のデコード)

類似記事

devlights.hatenablog.com

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

YAMLでは --- を使って、1ファイル内に複数のドキュメントを含めることが出来ます。

この場合、どのようにデコードするのか?って聞かれたので、ついでにここにもメモしておきます。

複数ドキュメントの場合は、その数分 Decode を呼び出すだけです。

試してみる

以下のようなYAMLがあるとします。

# Data 1
---
- hello
- world

# Data 2
---
- HELLO
- WORLD

# Data 3
---
- WORLD
- HELLO

1ファイル内に3ドキュメントある状態ですね。

んで、それをデコードするのが以下。

package threedash

import (
    "bytes"
    "io"
    "os"

    "github.com/devlights/gomy/output"
    "gopkg.in/yaml.v3"
)

// ThreeDash は、YAML の "---" で複数のドキュメントが存在する場合のサンプルです.
//
// # REFERENCES
//   - https://yaml.org/spec/1.2.2/
func ThreeDash() error {
    // Read file
    var (
        file *os.File
        buf  bytes.Buffer
        err  error
    )
    file, err = os.Open("./examples/basic/yamlop/three-dash/data.yaml")
    if err != nil {
        return err
    }
    defer file.Close()

    _, err = io.Copy(&buf, file)
    if err != nil {
        return err
    }

    // Decode yaml
    var (
        data    []string
        decoder = yaml.NewDecoder(&buf)
    )
    for {
        err = decoder.Decode(&data)
        if err != nil {
            if err == io.EOF {
                break
            }
            return err
        }

        output.Stdoutl("[data]", data)
    }

    return nil
}

実行すると以下のようになります。

gitpod /workspace/try-golang (master) $ task
task: [run] go run . -onetime

ENTER EXAMPLE NAME: yaml_threedash

[Name] "yaml_threedash"
[data]               [hello world]
[data]               [HELLO WORLD]
[data]               [WORLD HELLO]


[Elapsed] 150.05µs

参考情報

yaml.org

github.com

Goのおすすめ書籍

Go言語による並行処理

Go言語による並行処理

Amazon


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。