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