commit | 389beb8b70826bc617f5e8d713fe89e5af05f4cc | [log] [tgz] |
---|---|---|
author | Gustavo Niemeyer <[email protected]> | Fri Apr 05 15:46:35 2019 +0100 |
committer | Gustavo Niemeyer <[email protected]> | Fri Apr 05 15:46:35 2019 +0100 |
tree | 7063ef2374ee5af20b154e693f26212996108481 | |
parent | 7c00162d41f567cd4a5d9ff829afff062bc82e9c [diff] |
Preserve data in existing fields that are not decoded. This behavior change means it's now possible to pre-initialize values and then provide them to decoding, with the result being a sum of the previous data and the successfuly decoded fields. Particular care needs to be taken in loops that decode into the same value repeatedly. If the variable decoded into is declared in a scope out of the loop block, following iterations will observe data decoded in previous iterations. To fix that just move the variable declaration inside the loop. Discussed in #395.
The yaml package enables Go programs to comfortably encode and decode YAML values. It was developed within Canonical as part of the juju project, and is based on a pure Go port of the well-known libyaml C library to parse and generate YAML data quickly and reliably.
The yaml package supports most of YAML 1.2, but preserves some behavior from 1.1 for backwards compatibility.
Specifically, as of v3 of the yaml package:
and offers backwards compatibility with YAML 1.1 in some cases. 1.2, including support for anchors, tags, map merging, etc. Multi-document unmarshalling is not yet implemented, and base-60 floats from YAML 1.1 are purposefully not supported since they're a poor design and are gone in YAML 1.2.
The import path for the package is gopkg.in/yaml.v3.
To install it, run:
go get gopkg.in/yaml.v3
If opened in a browser, the import path itself leads to the API documentation:
The package API for yaml v3 will remain stable as described in gopkg.in.
The yaml package is licensed under the MIT and Apache License 2.0 licenses. Please see the LICENSE file for details.
package main import ( "fmt" "log" "gopkg.in/yaml.v3" ) var data = ` a: Easy! b: c: 2 d: [3, 4] ` // Note: struct fields must be public in order for unmarshal to // correctly populate the data. type T struct { A string B struct { RenamedC int `yaml:"c"` D []int `yaml:",flow"` } } func main() { t := T{} err := yaml.Unmarshal([]byte(data), &t) if err != nil { log.Fatalf("error: %v", err) } fmt.Printf("--- t:\n%v\n\n", t) d, err := yaml.Marshal(&t) if err != nil { log.Fatalf("error: %v", err) } fmt.Printf("--- t dump:\n%s\n\n", string(d)) m := make(map[interface{}]interface{}) err = yaml.Unmarshal([]byte(data), &m) if err != nil { log.Fatalf("error: %v", err) } fmt.Printf("--- m:\n%v\n\n", m) d, err = yaml.Marshal(&m) if err != nil { log.Fatalf("error: %v", err) } fmt.Printf("--- m dump:\n%s\n\n", string(d)) }
This example will generate the following output:
--- t: {Easy! {2 [3 4]}} --- t dump: a: Easy! b: c: 2 d: [3, 4] --- m: map[a:Easy! b:map[c:2 d:[3 4]]] --- m dump: a: Easy! b: c: 2 d: - 3 - 4