YAML in Go: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 9: Line 9:


import (
import (
"fmt"
  "fmt"
"gopkg.in/yaml.v3"
  "gopkg.in/yaml.v3"
"os"
  "os"
)
)


Line 27: Line 27:


type Root struct {
type Root struct {
Color  string  `yaml:"color"`
  Color  string  `yaml:"color"`
Details Details `yaml:"details"`
  Details Details `yaml:"details"`
}
}


type Details struct {
type Details struct {
Size    int      `yaml:"size"`
  Size    int      `yaml:"size"`
Weight  float64  `yaml:"weight"`
  Weight  float64  `yaml:"weight"`
Used    bool    `yaml:"used"`
  Used    bool    `yaml:"used"`
Options []string `yaml:"options"`
  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 {
panic(e)
}
//
// Marshal recursive memory struct into a file
//
if e := yaml.NewEncoder(f).Encode(&root); e != nil {
panic(e)
}
if e = f.Close(); e != nil {
panic(e)
}
fmt.Printf("yaml file written and closed\n")


f, e = os.Open("/Users/ovidiu/tmp/test.yaml")
  root := Root{
if e != nil {
    Color: "blue",
panic(e)
    Details: Details{
}
        Size:    10,
defer func() {
        Weight:  2.2,
if e = f.Close(); e != nil {
        Used:    true,
fmt.Printf("failed to close the file\n")
        Options: []string{"light", "medium", "heavy"},
}
    },
}()
  }
//
 
// Unmarshall the file into a different memory struct
  f, e := os.Create("/Users/ovidiu/tmp/test.yaml")
//
  if e != nil { ... }
config2 := Root{}
 
if e = yaml.NewDecoder(f).Decode(&config2); e != nil {
  //
panic(e)
  // Marshal recursive memory struct into a file
}
  //
fmt.Printf("%+v\n", config2)
 
  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)
}