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)
}
结果: