YAML in Go: Difference between revisions
Jump to navigation
Jump to search
Line 9: | Line 9: | ||
import ( | import ( | ||
"fmt" | |||
"gopkg.in/yaml.v3" | |||
"os" | |||
) | ) | ||
Line 27: | Line 27: | ||
type Root struct { | type Root struct { | ||
Color string `yaml:"color"` | |||
Details Details `yaml:"details"` | |||
} | } | ||
type Details struct { | type Details struct { | ||
Size int `yaml:"size"` | |||
Weight float64 `yaml:"weight"` | |||
Used bool `yaml:"used"` | |||
Options []string `yaml:"options"` | |||
} | } | ||
func main() { | 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) | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> |
Revision as of 00:24, 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:
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)
}