一、简介

配置文件有很多种类,比如.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格式的配置文件相关推荐

  1. Python语言解析xml文件

    python语言解析xml文件的常用的有两种方式: 通过MiniDom库解析xml文件 通过ElementTree库解析xml文件 MiniDom方式解析xml xml文件以data.xml为例,具体 ...

  2. c语言 自己编程解析 xml,C语言解析.XML文件

    最近手头上有个活在忙,中间很重要的一部分就是用C语言将.XML文件中想要的key和value读出来,与之前已有的值进行比较. 核心的.XML文件的格式如下: zzz xxx yyy 而我的思路是这样的 ...

  3. android 导入sqlite文件怎么打开,如何将sqlite文件导入到我的项目中?

    我在Android项目之外使用eclipse制作一个sqlight如何将sqlite文件导入到我的项目中? 我应该添加到我的Android清单中以使其工作? 感谢Mathias,让我们把这个q带到另一 ...

  4. python解析xml文件选用模块_python语言解析xml文件的常用的有两种方式

    MiniDom方式解析xml xml文件以data.xml为例,具体操作如下: data.xml: 保存用户的信息 Jordy 12345678 20 男 上网 功夫 34443678 18 男 功夫 ...

  5. java调用项目中的文件_详解eclipse项目中.classpath文件的使用

    1 前言 在使用eclipse或者myeclipse进行java项目开发的时候,每个project(工程)下面都会有一个.classpath文件,那么这个文件究竟有什么作用? 2 作用 .classp ...

  6. java中浏览器下载文件_浏览器下载java项目中的文件

    有一些文件保存在项目中需要在浏览器打开的页面中下载,需要找准文件的存储路径 工程格式 2.代码 public String execute() throws Exception { HttpServl ...

  7. C语言解析pcap文件得到HTTP信息实例(原创,附源码)

    原文:http://xiexiaohui.com.host2.ugocn.com/index.php/archives/34 转载请注明出处.来自 hello xiexh (xiexiaohui092 ...

  8. c语言编程题报文解析,C语言解析pcap文件得到HTTP信息实例

    程序功能为解析由Wireshark生成的pcap文件. 实现步骤: 1)用Wireshark软件抓包得到test.pcap文件 2)程序:分析pcap文件头 -> 分析pcap_pkt头 -&g ...

  9. c语言解析yaml文件,YAML课程

    YAML教程 一.简介 YAML是一种人们可以轻松阅读的数据序列化格式,并且它非常适合对动态编程语言中使用的数据类型进行编码.YAML是YAML Ain't Markup Language简写,和GN ...

最新文章

  1. Linux文件索引节点相关概念
  2. next() 与 nextLine() 区别
  3. python模块批量安装方法_python离线批量安装依赖包
  4. 打散算法的三种解决方案及其选型场景
  5. CF983B XOR-pyramid
  6. SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件
  7. python标签打印工具_NiceLabel Designer 2017条码标签打印软件
  8. python入门经典-Python入门经典
  9. 头条号如何提高文章推荐量和阅读量,头条号提高文章阅读量和推荐量的方法
  10. Windchill 零件操作通用类
  11. SCI写作之-结构和写作顺序
  12. 4 个方法养成大神级 “反内耗“ 体质
  13. 计算机打印东西怎么横向打印机,打印怎么设置横向打印(打印机怎么调整打印方向)...
  14. 加了索引,mysql查询就一定会用吗?
  15. 给二维码加密,防止内部资料外泄
  16. uni-app使用Hbuilder X如何苹果手机IOS打包、发布、运行
  17. 解决this application failed to start
  18. 登录华科校园网,我用Socket
  19. 【Python高级技能】超炫酷,电脑每天自动换壁纸,这个神器适合你。
  20. 数据泄漏防御DLP的确切定义

热门文章

  1. 化繁为简,在线表单工具值得一试!
  2. Layui上传获取数据为空 null
  3. 米兔积木机器人与履带机甲零件差别_米兔积木机器人履带机甲,比乐高还有趣的益智体验!...
  4. 故障诊断期刊文献分析
  5. C# 数字证书应用集成教程
  6. 使用 HappyPack 和 DllPlugin 来提升你的 Webpack 构建速度
  7. QR 二维码布局(五)
  8. 郭健:Linux内存管理系统参数配置之overcommit
  9. 香港科技大学开通CnOpenData试用
  10. android获取刘海屏状态栏高度,Android刘海屏全面屏底部导航栏的适配