YAML (YAML Ain't a Markup Language)
是一种标记语言,通常以.yml
为后缀的文件,是一种直观的能够被计算机程序识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,一种专门用来写配置文件的语言。可用于如: Java,C/C++, Ruby, Python, Perl, C#, PHP等。
优点:
易于人们阅读。数据在编程语言之间是可移植的。匹配敏捷语言的本机数据结构。具有一致的模型来支持通用工具。支持单程处理。具有表现力和可扩展性。易于实现和使用。
约定:k: v
表示键值对关系,冒号后面必须有一个空格
使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的
大小写敏感
缩进时不允许使用Tab键,只允许使用空格。
松散表示,java中对于驼峰命名法,可用原名或使用-代替驼峰。
Go语言读取并解析yml文件用到了os.ReadFile
和gopkg.in/yaml.v2
。
首先定义yml的struct数据格式,然后读取文件字节,最后解析yml字节为struct数据格式。
config.yml
obj1: # 对象map
str1: '单引号\n不转义'
str2: "双引号\n转义"
obj2: {"a1": 1, "a2": 2}
dt: 2022/02/14 # 日期
ip_list1: # 多行list
- 172.18.0.1
- 172.18.0.2
ip_list2: [172.18.0.3, 172.18.0.4] # 行内list
可以使用yaml2go转换yml数据结构到go类型。
另外还有很多类似工具:
YAML 转 GO: www.printlove.cn/tools/yaml2go
JSON 转 GO: www.printlove.cn/tools/json2go
SQL 转 GORM Model: www.printlove.cn/tools/sql2gorm
SQL 转 entgo schema: printlove.cn/tools/sql2ent
SQL 转 go-zero Model: printlove.cn/tools/sql2gozero
go代码
package main
import (
"fmt"
"os"
"gopkg.in/yaml.v2"
)
func main() {
// Obj2
type Obj2 struct {
A1 int `yaml:"a1"`
A2 int `yaml:"a2"`
}
// Obj1
type Obj1 struct {
Str1 string `yaml:"str1"`
Str2 string `yaml:"str2"`
}
// Config
type Config struct {
Obj1 Obj1 `yaml:"obj1"`
Obj2 Obj2 `yaml:"obj2"`
Dt string `yaml:"dt"`
IpList1 []string `yaml:"ip_list1"`
IpList2 []string `yaml:"ip_list2"`
}
config := Config{}
data, err := os.ReadFile("config.yml")
if err != nil {
panic("读取文件失败")
}
err = yaml.Unmarshal(data, &config)
if err != nil {
panic("解析文件失败")
}
fmt.Println(config.Obj1.Str1)
}
参考
https://pkg.go.dev/gopkg.in/yaml.v2#example-Unmarshal-Embedded