先说结论:我们选型TOML
yaml,toml,json,ini 实际业务都有用
实际栗子是:我们想要把Go的切片作为配置文件,YAML写起来比较吃力,TOML就很容易了。
配置文件是用于配置计算机程序的参数、初始化设置的文件、业务数据公共配置等。如果没有这些配置,我们的程序就会硬编码,不够灵活
配置文件的作用主要是给即将运行的程序提供初始值,凡是在环境发生改变时需要修改的选项就可以设置成配置项。
配置文件流行分为这几类
-
TOML 结合了 INI 和 YAML 的优点
- TOML 的写法和 ini 几乎一致,切换成本为 0 ;
- 支持所有的 YAML 数据类型,甚至支持时间格式;
- 支持像 ini 的 section 分组,只是在 TOML 中,它叫做 table;
- 解析像 YAML 那样简单。
- 支持bool、int、float、字符串、字符串数组
-
YAML (缩进怪)
- 容易阅读和修改,支持注释。
- 支持丰富的数据类型,对象、数组、纯量
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值;字符串、bool、int、float、Null、时间、日期
- 不同格式的明确表达。
- 强制缩进。虽然不规定具体缩进几个空格,但是同一级的内容要保持相同的缩进。
- 冒号后面一定要加空格,否则无法解析。
-
INI
- 比较适合配置项的数据类型只是简单的字符串、数字的情况,如果涉及数组和 key/value 的嵌套,会比较吃力。
- section 无法嵌套, 嵌套后的效果和没有嵌套是一样的。
- 字符串的表示不要加引号,否则引号也会被解析出来。
-
JSON
- 不支持注释
- 花括号多,影响可读性
-
XML
- 业务不常用
什么要的配置文件格式是好格式
- 容易阅读和修改、最好支持注释。 所以 json 不是一种好的格式。
- 易于解析,支持多数据类型。 INI 和 xml 不合适。
- 不同格式用不同的表达。 YAML 和 TOML 做得非常好。
针对各自的使用做示例和对比
TOML
参考地址:github:https://github.com/toml-lang/toml
中文:https://github.com/LongTengDao/TOML/blob/龙腾道-译/toml-v1.0.0.md
# 例子
[analysis]
# 全基因分析
whole_genome = ["WGS", "childWGS", "WGS-HD"]
YAML
github:https://github.com/go-yaml/yaml
# 例子
# 项目根目录
root: "/mnt/project/bap"
# cors allow address
allow_origins:
- "http://127.0.0.1:8080"
# 批量计算及多重样本写结论并发数
analysis:
multiple_analysis: 50
multiple_write: 30
full_exon: 5
whole_genome: 5
将yaml配置内容解析到map对象中
如果不定义struct进行Unmarshal,可以直接声明一个map对象:
resultMap := make(map[string]interface{}),代替struct 结构体来进行解析。
INI
# 例子
; A comment line
[Section]
enabled = true
path = /usr/local # another comment
JSON
# 例子
{
"enabled": true,
"path": "/usr/local"
}
XML
# 例子
<?xml version="1.0" encoding="UTF-8" ?>
<Config>
<enabled>true</enabled>
<path>/usr/local</path>
</Config>