如何在Go中使用YAML

GoYAML教程展示了如何在Go中使用YAML。我们使用yaml.v3包。

$ go version
go version go1.18.1 linux/amd64

我们使用Go版本1.18。

YAML格式

YAML(YAML不是标记语言)是一种人类可读的数据序列化语言。它通常用于配置文件,但也用于数据存储(例如调试输出)或传输(例如文档标头)。

YAML原生支持三种基本数据类型:标量(例如字符串、整数和浮点数)、列表和关联数组。

官方推荐的YAML文件扩展名是.yaml

yaml包

yaml包使Go程序能够轻松地编码和解码YAML值。yaml包支持大部分YAML1.1和1.2。

$ go get gopkg.in/yaml.v3

此命令安装yaml包的版本3。

GoYAML读取示例

在第一个示例中,我们读取了一个简单的YAML文件。

raincoat: 1
coins: 5
books: 23
spectacles: 2
chairs: 12
pens: 6

我们有几个标量值。

func Unmarshal(in []byte, out interface{}) (err error)

Unmarshal函数对在in字节切片中找到的第一个文档进行解码,并将解码后的值分配给out值。

package main

import (
     "fmt"
     "io/ioutil"
     "log"

     "gopkg.in/yaml.v3"
)

func main() {

     yfile, err := ioutil.ReadFile("items.yaml")

     if err != nil {

          log.Fatal(err)
     }

     data := make(map[interface{}]interface{})

     err2 := yaml.Unmarshal(yfile, &data)

     if err2 != nil {

          log.Fatal(err2)
     }

     for k, v := range data {

          fmt.Printf("%s -> %d\n", k, v)
     }
}

我们读取了items.yaml文件的内容。

data := make(map[interface{}]interface{})

定义了我们读取数据的地图。

err2 := yaml.Unmarshal(yfile, &data)

我们将数据解组到地图中。

for k, v := range data {

     fmt.Printf("%s -> %d\n", k, v)
}

我们遍历地图并打印它的键和值。

$ go run read_items.go 
books -> 23
spectacles -> 2
chairs -> 12
pens -> 6
raincoat -> 1
coins -> 5

GoYAML阅读示例二

在下一个示例中,我们读取用户。

user 1:
    name: John Doe
    occupation: gardener
user 2:
    name: Lucy Black
    occupation: teacher
user 3:
    name: Roger Roe
    occupation: driver

文件中有几个用户。

package main

import (
     "fmt"
     "io/ioutil"
     "log"

     "gopkg.in/yaml.v3"
)

type User struct {
     Name       string
     Occupation string
}

func main() {

     yfile, err := ioutil.ReadFile("users.yaml")

     if err != nil {

          log.Fatal(err)
     }

     data := make(map[string]User)

     err2 := yaml.Unmarshal(yfile, &data)

     if err2 != nil {

          log.Fatal(err2)
     }

     for k, v := range data {

          fmt.Printf("%s: %s\n", k, v)
     }
}

在代码示例中,我们有User结构,它表示文件中的一条用户记录。

data := make(map[string]User)

我们定义了一个用户地图。

err2 := yaml.Unmarshal(yfile, &data)

我们将数据反序列化为地图或用户。

$ go run read_simple.go 
user 1: {John Doe gardener}
user 2: {Lucy Black teacher}
user 3: {Roger Roe driver}

GoYAML编写示例

我们将几个单词写入YAML文件。

func Marshal(in interface{}) (out []byte, err error)

Marshal函数将提供的值序列化为YAML文档。

package main

import (
     "fmt"
     "io/ioutil"
     "log"

     "gopkg.in/yaml.v3"
)

func main() {

     words := [5]string{"falcon", "sky", "earth", "cloud", "fox"}

     data, err := yaml.Marshal(&words)

     if err != nil {
          log.Fatal(err)
     }

     err2 := ioutil.WriteFile("words.yaml", data, 0)

     if err2 != nil {

          log.Fatal(err2)
     }

     fmt.Println("data written")
}

我们有一个单词数组;该数组使用Marshal序列化为YAML格式,并使用WriteFile写入words.yaml

$ go run write_words.go 
data written
$ cat words.yaml 
- falcon
- sky
- earth
- cloud
- fox

GoYAML写例子二

在下面的示例中,我们将用户写入YAML文件。

package main

import (
     "fmt"
     "io/ioutil"
     "log"

     "gopkg.in/yaml.v3"
)

type User struct {
     Name       string
     Occupation string
}

func main() {

     users := map[string]User{"user 1": {"John Doe", "gardener"},
          "user 2": {"Lucy Black", "teacher"}}

     data, err := yaml.Marshal(&users)

     if err != nil {

          log.Fatal(err)
     }

     err2 := ioutil.WriteFile("users.yaml", data, 0)

     if err2 != nil {

          log.Fatal(err2)
     }

     fmt.Println("data written")
}

我们有一张用户地图;每个用户都由一个User结构表示。我们使用Marshal将地图序列化为YAML格式,并使用WriteFile将数据写入users.yaml文件。

$ go run write_users.go 
data written
$ cat users.yaml 
user 1:
    name: John Doe
    occupation: gardener
user 2:
    name: Lucy Black
    occupation: teacher

GoYAML写例子三

仅导出的结构字段(首字母大写)被编组。默认情况下,它们使用小写的字段名称进行编组。

自定义键可以通过字段标签中的yaml名称来定义。第一个逗号之前的内容用作键,以下逗号分隔的选项用于调整编组过程。

package main

import (
     "fmt"
     "io/ioutil"
     "log"

     "gopkg.in/yaml.v3"
)

type Record struct {
     Item string `yaml:"item"`
     Col  string `yaml:"colour"`
     Size string `yaml:"size"`
}

type Config struct {
     Record Record `yaml:"Settings"`
}

func main() {

     config := Config{Record: Record{Item: "window", Col: "blue", Size: "small"}}

     data, err := yaml.Marshal(&config)

     if err != nil {

          log.Fatal(err)
     }

     err2 := ioutil.WriteFile("config.yaml", data, 0)

     if err2 != nil {
          
          log.Fatal(err2)
     }

     fmt.Println("data written")
}

在代码示例中,我们编写配置数据。

$ go run write_config.go 
data written
$ cat config.yaml 
Settings:
    item: window
    colour: blue
    size: small

在本教程中,我们使用了Go中的YAML格式。

列出所有Go教程。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏