YAML in Go: Difference between revisions
Jump to navigation
Jump to search
Line 1: | Line 1: | ||
=Internal= | =Internal= | ||
* [[Go Code Examples#Code_Examples|Go Code Examples]] | * [[Go Code Examples#Code_Examples|Go Code Examples]] | ||
* [[Go Structs]] | |||
=Overview= | =Overview= | ||
Revision as of 00:36, 17 October 2023
Internal
Overview
Declare a recursive structure that matches the structure of the YAML file, and then use a YAML encoder/decoder to marshall/unmarshall data in and out.
YAML support is available in the gopkg.in/yaml.v3
package.
If the structure fields are not capitalized, they are not visible across packages, and their content will zero-ed.
Come up with an in-depth explanation for this.
package main
import (
"fmt"
"gopkg.in/yaml.v3"
"os"
)
//
// color: "blue:
// details:
// size: 10
// weight 2.2
// used: true
// options:
// - light
// - medium
// - heavy
//
type Root struct {
Color string `yaml:"color"`
Details Details `yaml:"details"`
}
type Details struct {
Size int `yaml:"size"`
Weight float64 `yaml:"weight"`
Used bool `yaml:"used"`
Options []string `yaml:"options"`
}
func main() {
root := Root{
Color: "blue",
Details: Details{
Size: 10,
Weight: 2.2,
Used: true,
Options: []string{"light", "medium", "heavy"},
},
}
f, e := os.Create("/Users/ovidiu/tmp/test.yaml")
if e != nil { ... }
//
// Marshal recursive memory struct into a file
//
if e := yaml.NewEncoder(f).Encode(&root); e != nil { ... }
if e = f.Close(); e != nil { ... }
fmt.Printf("yaml file written and closed\n")
f, e = os.Open("/Users/ovidiu/tmp/test.yaml")
if e != nil { ... }
defer func() {
if e = f.Close(); e != nil { ... }
}()
//
// Unmarshall the file into a different memory struct
//
config2 := Root{}
if e = yaml.NewDecoder(f).Decode(&config2); e != nil { ... }
fmt.Printf("%+v\n", config2)
}