简介
YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的缩写。相比JSON格式的方便。
语法
- 内容是大小写敏感
- 使用缩进表示层级关系(有点像Python缩进)
- 缩进只允许空格,不能使用tab代替
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- 注释使用"#"
- key后面冒号要加一个空格
数据类型
YAML 支持以下常用几种数据类型:
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值
纯量
key对应value
name: opcai
使用缩进的方式
name:
? opcai
纯量是最基本的,不可再分的值,包括:
- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期
对象
account: { name: opcai }
使用缩进方式
account:
? name: opcai
数组
以 - 开头的行表示构成一个数组
opcai:
? - linux
? - golang
? - python
也可以使用[]
opcai: [ linux , golang , python ]
数据里面也可以包含对象
opcai:
? - linux: manjaro
? - golang: gin
? - python: django
Go处理 YAML
Go有开源的第三方库可以直接操作YAML
gopkg.in/yaml.v3
例如:
有配置文件是app.yaml
mysql:
host: "127.0.0.1"
port: 3306
user: root
passowrd: opcai
db_name: opcai
Go读取例子
package main
import (
"fmt"
"io/ioutil"
?
"log"
?
"gopkg.in/yaml.v2"
)
?
type Config struct {
MySQL MySQLConfig `yaml:"mysql"`
}
?
type MySQLConfig struct {
Host ? ? string `yaml:"host"`
Port ? ? int ? ?`yaml:"port"`
User ? ? string `yaml:"user"`
Password string `yaml:"password"`
DBName ? string `yaml:"db_name"`
}
?
func main() {
fileContent, err := ioutil.ReadFile("app.yaml")
if err != nil {
log.Panicln(err)
}
config := Config{}
err = yaml.Unmarshal(fileContent, &config)
if err != nil {
log.Panicln(err)
}
fmt.Println(config.MySQL.Host, config.MySQL.Port, config.MySQL.User, config.MySQL.Password, config.MySQL.DBName)
}
?
总结
现在很多应用都是使用yaml作为配置文件,还是比较流行的。