用 BurntSushi/toml 读配置文件,先用 os.Stat 确认文件存在,再交给 DecodeFile 填进结构体。
import "github.com/BurntSushi/toml"
path := "./config/template.toml"
if _, err := os.Stat(path); err != nil {
return nil, err
}
// 解析配置文件
cfg := Config{}
_, err := toml.DecodeFile(path, &cfg)
if err != nil {
return nil, err
}
fmt.printLn(cfg)
数组表:[[stream]]
双中括号表示这里是一个数组,每写一次 [[stream]] 就往数组里追加一个元素。紧跟其后的 [stream.ffmpeg] 不是新元素,而是刚追加那个元素下面的子表。下面这份配置解析出来是两个元素,每个都带一个 ffmpeg 子表:
[[stream]]
a = 1
b = 2
c = "3"
[stream.ffmpeg]
acodec = "aac"
vcodec = "libx264"
font_size = 20
[[stream]]
a = 1
b = 2
c = "3"
[stream.ffmpeg]
acodec = "aac"
vcodec = "libx264"
font_size = 20
其他类型
一份把常见写法都用上的示例:
# 全局信息
title = "TOML示例"
# 应用信息
[app]
author = "史布斯"
organization = "Mafool"
mark = "第一行\n第二行." # 换行
release = 2020-05-27T07:32:00Z # 时间
# 数据库配置
[mysql]
server = "192.168.1.1"
ports = [ 8001, 8001, 8002 ] # 数组
connection_max = 5000
enabled = true
# Redis主从 # 字典对象
[redis]
[redis.master]
host = "10.0.0.1"
port = 6379
[redis.slave]
host = "10.0.0.1"
port = 6380
# 二维数组
[releases]
release = ["dev", "test", "stage", "prod"]
tags = [["dev", "stage", "prod"],[2.2, 2.1]]
# 公司信息 #对象嵌套
[company]
name = "xx科技"
[company.detail]
type = "game"
addr = "北京朝阳"
icp = "030173"
对应到语法层面:
- 字符串里的
\n会解成真实换行; - 不带引号的
2020-05-27T07:32:00Z是 TOML 原生的日期时间类型,不是字符串; [ 8001, 8001, 8002 ]是一维数组,[["dev", ...], [2.2, 2.1]]是元素类型都不要求一致的二维数组;[redis.master]这种点号写法等价于在[redis]里再嵌一层表,和[company.detail]是同一种嵌套。
评论
还没有人留言。