c语言解析toml文件,使用BurntSushi/toml处理项目中toml格式的配置文件
一、简介
配置文件有很多种类,比如.ini、xml、json、YAML再到TOML,TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner。TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。
说白了,就是将指定格式的配置文件中的内容,映射到某个变量中,从而通过这个变量取访问配置文件中的内容。
关于TOML的一些规范
1、OML是大小写敏感的
2、TOML文件必须是UTF8编码的
3、空白符可以是制表符(0x09)或空格(0x20)
4、换行符可以是 LF (0x0A) 或 CRLF (0x0D0A)
在最开始接触go语言的时候,配置文件,我往往都是通过json.Unmarshal进行关联映射。如下:
假设配置文件如下:{
"debug": true,
"db": {
"dsn": "root:test@tcp(127.0.0.1:3363)/findme",
"maxIdle": 30
}
}
先来搞一下,如果不其他组件,我们需要自己读取配置文件,通过json.Unmarshal进行关联映射。如下:
config/conf.gopackage config
import (
"log"
"encoding/json"
"github.com/toolkits/file"
)
type GlobalConfig struct {
Debug bool `json:"debug"`
DataBase DataBase `json:"db"`
}
type DataBase struct {
DNS string `json:"dsn"`
MaxIdle int `json:"maxIdle"`
}
var gConfig * GlobalConfig
func GetConfig() *GlobalConfig {
return gConfig
}
func ParseConf(filePath string) {
if filePath == "" {
log.Fatalln("use -c to specify configuration file")
}
if !file.IsExist(filePath) {
log.Fatalln("config file:", filePath, "is not existent")
}
fileContent, err :=file.ToString(filePath)
if err != nil {
log.Fatalln("read config file:", filePath, "fail:", err)
}
err = json.Unmarshal([]byte(fileContent), &gConfig)
if err != nil {
log.Fatalln("parse config file:", filePath, "fail:", err)
}
}
调用如下:package main
import (
"fmt"
"flag"
"test/config"
)
func main() {
configFile := flag.String("c", "config/conf.toml", "configuration file")
flag.Parse()
config.ParseConf(*configFile)
fmt.Println(config.GetConfig().DataBase) //打印数据库信息
}
二、案例
如果我们需要使用的配置文件,还是上面内容,此时,需要我们将其转为toml格式的,如下:#是否开启调试模式
debug = true
#数据库的配置
[db]
dns = "root:test@tcp(127.0.0.1:3363)/findme"
maxIdle = 30
映射配置文件的程序如下:package config
import (
"log"
"github.com/BurntSushi/toml"
"sync"
)
var lock = new(sync.RWMutex)
type GlobalConfig struct {
Debug bool `toml:"debug"`
DataBase DataBase `toml:"db"`
}
type DataBase struct {
DNS string `toml:"dns"`
MaxIdle int `toml:"maxIdle"`
}
var gConfig *GlobalConfig
func GetConfig() *GlobalConfig {
lock.RLock() //加读锁,防止读的时候,被写
defer lock.RUnlock() //读完解锁
return gConfig
}
func ParseConf(filePath string) {
lock.RLock()
defer lock.RUnlock()
if filePath == "" {
log.Fatalln("use -c to specify configuration file")
}
_, err := toml.DecodeFile(filePath, &gConfig)
if err != nil {
log.Println("toml.DecodeFile error")
panic(err)
}
}
调用和上面保持一致即可,运行结果如下:{root:test@tcp(127.0.0.1:3363)/findme 30}
注意事项:若配置文件是json格式,我们在结构体的tags中使用了json,配置文件是toml格式的,我们在结构体的tags中使用了toml。
c语言解析toml文件,使用BurntSushi/toml处理项目中toml格式的配置文件相关推荐
- Python语言解析xml文件
python语言解析xml文件的常用的有两种方式: 通过MiniDom库解析xml文件 通过ElementTree库解析xml文件 MiniDom方式解析xml xml文件以data.xml为例,具体 ...
- c语言 自己编程解析 xml,C语言解析.XML文件
最近手头上有个活在忙,中间很重要的一部分就是用C语言将.XML文件中想要的key和value读出来,与之前已有的值进行比较. 核心的.XML文件的格式如下: zzz xxx yyy 而我的思路是这样的 ...
- android 导入sqlite文件怎么打开,如何将sqlite文件导入到我的项目中?
我在Android项目之外使用eclipse制作一个sqlight如何将sqlite文件导入到我的项目中? 我应该添加到我的Android清单中以使其工作? 感谢Mathias,让我们把这个q带到另一 ...
- python解析xml文件选用模块_python语言解析xml文件的常用的有两种方式
MiniDom方式解析xml xml文件以data.xml为例,具体操作如下: data.xml: 保存用户的信息 Jordy 12345678 20 男 上网 功夫 34443678 18 男 功夫 ...
- java调用项目中的文件_详解eclipse项目中.classpath文件的使用
1 前言 在使用eclipse或者myeclipse进行java项目开发的时候,每个project(工程)下面都会有一个.classpath文件,那么这个文件究竟有什么作用? 2 作用 .classp ...
- java中浏览器下载文件_浏览器下载java项目中的文件
有一些文件保存在项目中需要在浏览器打开的页面中下载,需要找准文件的存储路径 工程格式 2.代码 public String execute() throws Exception { HttpServl ...
- C语言解析pcap文件得到HTTP信息实例(原创,附源码)
原文:http://xiexiaohui.com.host2.ugocn.com/index.php/archives/34 转载请注明出处.来自 hello xiexh (xiexiaohui092 ...
- c语言编程题报文解析,C语言解析pcap文件得到HTTP信息实例
程序功能为解析由Wireshark生成的pcap文件. 实现步骤: 1)用Wireshark软件抓包得到test.pcap文件 2)程序:分析pcap文件头 -> 分析pcap_pkt头 -&g ...
- c语言解析yaml文件,YAML课程
YAML教程 一.简介 YAML是一种人们可以轻松阅读的数据序列化格式,并且它非常适合对动态编程语言中使用的数据类型进行编码.YAML是YAML Ain't Markup Language简写,和GN ...
最新文章
- Linux文件索引节点相关概念
- next() 与 nextLine() 区别
- python模块批量安装方法_python离线批量安装依赖包
- 打散算法的三种解决方案及其选型场景
- CF983B XOR-pyramid
- SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件
- python标签打印工具_NiceLabel Designer 2017条码标签打印软件
- python入门经典-Python入门经典
- 头条号如何提高文章推荐量和阅读量,头条号提高文章阅读量和推荐量的方法
- Windchill 零件操作通用类
- SCI写作之-结构和写作顺序
- 4 个方法养成大神级 “反内耗“ 体质
- 计算机打印东西怎么横向打印机,打印怎么设置横向打印(打印机怎么调整打印方向)...
- 加了索引,mysql查询就一定会用吗?
- 给二维码加密,防止内部资料外泄
- uni-app使用Hbuilder X如何苹果手机IOS打包、发布、运行
- 解决this application failed to start
- 登录华科校园网,我用Socket
- 【Python高级技能】超炫酷,电脑每天自动换壁纸,这个神器适合你。
- 数据泄漏防御DLP的确切定义