yaml文件已经成为配置的一种主要格式,因此各种语言都提供了相应的解析类库, 本文就以go语言中常用的yaml解析库 gopkg.in/yaml为例,简单展示一下如何解析yaml文件
具体代码在这里:
1, 直接将yaml文件内容解析为我们定义好的struct, 这种简单方便,想获取对应值,可以直接获取。
2, 将yaml文件解析为map[string] interface{}, 然后根据需要层层解析, 主要优点不需要提前定义yaml文件的struct,可以随时更改yaml文件格式。
app:
name: demoApp
cache:
enable : false
list : [redis, memcache]
mysql:
user : root
password : mypassword
host : 192.168.2.5
port : 3306
dbname : db1
解析代码
package main
import (
"fmt"
"io/ioutil"
"log"
yaml "gopkg.in/yaml.v2"
)
func main() {
fmt.Println("---start---")
conf := new(Yaml)
yamlFile, err := ioutil.ReadFile("test.yaml")
log.Println("yamlFile:", string(yamlFile))
if err != nil {
log.Printf("yamlFile.Get err %v", err)
}
err = yaml.Unmarshal(yamlFile, conf)
if err != nil {
log.Fatalf("Unmarshal: %v when to struct", err)
}
log.Println("conf", conf)
log.Printf("mysqlHost:%s, port:%d, cacheList:%s", conf.Mysql.Host, conf.Mysql.Port, conf.Cache.List)
configMap := make(map[string]interface{})
err = yaml.Unmarshal(yamlFile, configMap)
if err != nil {
log.Fatalf("Unmarshal: %v when to map", err)
}
for k,v := range configMap {
_, isStr := v.(string)
_, isInt32 := v.(int32)
_, isBool := v.(bool)
if isStr {
fmt.Printf("key:%s, value(string):%s \n", v)
} else if isInt32 {
fmt.Printf("key:%s, value(int32):%d \n", k,v)
} else if isBool {
fmt.Printf("key:%s, value(bool):%t \n", k,v)
} else {
fmt.Printf("key:%s, value:%s \n", k,v)
}
}
fmt.Printf("---遍历结束---\n")
// 使用map表示已经提前知道结构是什么样的, 可以将map提取为自己想要的格式
mysqlValueInterface := configMap["mysql"]
mysqlValue, ok := mysqlValueInterface.(interface{})
if ok {
mysqlMap, ok := mysqlValue.(map[interface{}]interface{})
if ok {
log.Printf(" map解析结果。 mysqlHost:%s, port:%d", mysqlMap["host"], mysqlMap["port"])
} else {
log.Printf("no mysql info")
}
} else {
log.Printf("no mysql value is not interface")
}
log.Printf("---程序结束---\n")
}
定义的struct
package main
// Yaml struct of yaml
type Yaml struct {
App struct {
Name string `yaml:"name"`
}
Mysql struct {
Host string `yaml:"host"`
Port int32 `yaml:"port"`
DbName string `yaml:"dbName"`
User string `yaml:"user"`
Password string `yaml:"password"`
}
Cache struct {
Enable bool `yaml:"enable"`
List []string `yaml:"list,flow"`
}
}
---start---
2020/05/17 12:39:29 yamlFile: app:
name: demoApp
cache:
enable : false
list : [redis, memcache]
mysql:
user : root
password : mypassword
host : 192.168.2.5
port : 3306
dbname : db1
2020/05/17 12:39:29 conf &{{demoApp} {192.168.2.5 3306 root mypassword} {false [redis memcache]}}
2020/05/17 12:39:29 mysqlHost:192.168.2.5, port:3306, cacheList:[redis memcache]
key:app, value:map[name:demoApp]
key:cache, value:map[enable:%!s(bool=false) list:[redis memcache]]
key:mysql, value:map[dbname:db1 host:192.168.2.5 password:mypassword port:%!s(int=3306) user:root]
---遍历结束---
2020/05/17 12:39:29 map解析结果。 mysqlHost:192.168.2.5, port:3306
2020/05/17 12:39:29 ---程序结束---
Process exiting with code: 0
备注:go 语言还有其他yaml解析库, 例如github.com/go-yaml/yaml、 sigs.k8s.io/yaml, 我们在https://pkg.go.dev/search?q=yaml 可以发现很多,每种基本都提供了example代码。 例如, 本文就参考了https://pkg.go.dev/gopkg.in/yaml.v2?tab=doc#pkg-examples, https://github.com/go-yaml/yaml