YAML 格式

YAML(YAML 不是标记语言)是一种人类可读的数据序列化语言。它通常用于配置文件,但也用于数据存储(例如调试输出)或传输(例如文档标题)。

YAML 本身支持三种基本数据类型:标量(例如字符串、整数和浮点数)、列表和关联数组。

YAML 文件的官方推荐文件扩展名是.yaml。

获取yaml 包

该yaml包使 Go 程序能够轻松地对 YAML 值进行编码和解码。yaml 包支持大部分 YAML 1.1 和 1.2。go get gopkg.in/yaml.v3 此命令安装 yaml 包的第 3 版。

示例

读取yaml配置文件指定的内容

user.yaml

user 1:
    name: John Doe
    occupation: gardener
user 2:
    name: Lucy Black
    occupation: teacher
user 3:
    name: Roger Roe
    occupation: driver

获取参数: read_users.go

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)
     }
}

先创建一个结构体,然后定义一个map,从yaml中反序列化取值。

实验

正在写的网站用到的yaml反序列化读取: app.yaml文件:

# 数据库
database:
  host : "localhost"
  port : 3306
  user : "root"
  password : "root"
# qmtt配置
qmtt:
  host : "lo"
  port : 111
  user : "xx"
  password : "ww"
# 网站
web:
  # 网站标题
  info:
    title : "xxx"
    port : 8000
  # 后台登录
  login:
    user : "admin"
    password : "password"
    jwtkey : "123456"
    timeout : 300
  # 企业微信配置
  wechat:
    corpid : "12"
    corpsecret : "34"
  # ip限制
  ip:
    # 限制/允许
    limit : "192.168.1.1/8"
    allow : "192.168.30.2"
  # 日志配置
  debug:
    loglevel : "debug"
             # "disable"
             # "fatal"
             # "error"
             # "warn"
             # "info"
             # "debug"

main.go文件信息:

package main

import (
	"io/ioutil"
	"log"

	"gopkg.in/yaml.v3"
)

// yaml 配置文件的根
type ROOT struct {
	// 数据库配置
	Database struct {
		Host     string `yaml:"host"`
		User     string `yaml:"user"`
		Password string `yaml:"password"`
		Port     int    `yaml:"port"`
	}
	// qmtt配置
	Qmtt struct {
		Host     string `yaml:"host"`
		User     string `yaml:"user"`
		Password string `yaml:"password"`
		Port     int    `yaml:"port"`
	}
	// web相关配置根
	Web struct {
		// 网站标题、端口
		Info struct {
			Title string `yaml:"title"`
			Port  int    `yaml:"port"`
		}
		// 网站登录相关
		Login struct {
			User     string `yaml:"user"`
			Password string `yaml:"password"`
			Jwtkey   string `yaml:"jwtkey"`
			Timeout  int    `yaml:"timeout"`
		}
		// 企业微信转发
		Wechat struct {
			Corpid     string `yaml:"corpid"`
			Corpsecret string `yaml:"corpsecret"`
		}
		// ip限制
		Ip struct {
			Limit string `yaml:"limit"`
			Allow string `yaml:"allow"`
		}
		// 日志配置
		Debug struct {
			LogLevel string `yaml:"loglevel"`
		}
	}
}

// 输入结构体,返回数据
func main() {
	// 读完不用手动关
	f, err := ioutil.ReadFile("app.yaml")
	if err != nil {
		log.Fatalln("Open Config Failed!", err)
	}
	var root ROOT
	// 执行解析
	err = yaml.Unmarshal([]byte(f), &root)
	if err != nil {
		log.Fatalf("yaml unmarshal error: %v", err)
	}
	log.Println(root)

}

结果:

4c675bffa2f096bfb71dcab726d2d15c.png

参考

https://zetcode.com/golang/yaml/