go解析yaml文件示例

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

你可能感兴趣的:(go)