【Go学习笔记15】解析yaml
在项目中,难免会用到配置文件,目前来说,yaml格式的配置文件应该是最流行的,那么在Go中如何来解析yaml配置文件呢。
解析yaml文件
假设我们现在有一个config.dev.yaml的配置文件,里面的内容如下:
version: 0.0.1
复制代码
那么我们可以像下面这样来解析:
package main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
"io/ioutil"
)
type Config struct {
Version string `yaml:"version"`
}
func main() {
t := Config{}
buffer, err := ioutil.ReadFile("./config.dev.yaml")
err = yaml.Unmarshal(buffer, &t)
if err != nil {
log.Fatalf(err.Error())
}
fmt.Printf(t.Version)
}
复制代码
上面的代码中,首先定义了一个自定义类型Config,这个类型和yaml中的属性配置了映射,这样在后面解析的时候就可以将值设置到对应的属性上。在main方法中,首先通过ioutil的ReadFile方法来读取配置文件的数据,然后再调用yaml的Unmarshal方法来解析数据到对象t中,注意这里必须传递t的地址(&t),这种形式,否则会报错。
解析嵌套的yaml
上面的例子只是解析了最简单的,没有嵌套结果的yaml配置文件,但是在实际的开发过程中,嵌套的yaml配置文件经常出现。下面来看下如何解析嵌套的yaml配置文件。
假设我们有一个config.dev.yaml的文件,内容如下:
version: 0.0.1
author:
name: zhongzhong
age: 25
复制代码
那么我们可以使用下面的代码来解析:
package main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
"io/ioutil"
)
type Config struct {
Version string `yaml:"version"`
Author struct {
Name string `yaml:"name"`
Age int `yaml:"age"`
}
}
func main() {
t := Config{}
buffer, err := ioutil.ReadFile("./config.dev.yaml")
err = yaml.Unmarshal(buffer, &t)
if err != nil {
log.Fatalf(err.Error())
}
fmt.Printf("%v",t)
}
复制代码
输出结果:
{0.0.1 {zhongzhong 25}}
复制代码
将yaml配置内容解析到map对象中
上面的例子,我们都需要定义一个自定义类型,然后还需要配置映射,有时候感觉会很麻烦,那么我们就可以将yaml解析到一个map对象中。
还是上面的配置内容,可以使用 下面的代码来将内容解析到一个map对象中:
package main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
"io/ioutil"
)
func main() {
t := map[string]interface{}{}
buffer, err := ioutil.ReadFile("./config.dev.yaml")
err = yaml.Unmarshal(buffer, &t)
if err != nil {
log.Fatalf(err.Error())
}
fmt.Printf("%v",t)
}
复制代码
输出结果:
map[version:0.0.1 author:map[name:zhongzhong age:25]]
复制代码