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教程。
