首页 > 其他分享 >toml简单介绍

toml简单介绍

时间:2023-04-19 11:04:01浏览次数:37  
标签:name TOML 介绍 键值 数组 简单 go toml

现在很多软件配置文件都是.toml格式的了,所以作为运维人员,很有必要了解下toml。

官网网址

https://toml.io/cn/

概念

为人而生的配置文件格式。

TOML 旨在成为一个最小化配置文件格式,它:

  • 语义明显易于阅读
  • 能无歧义地映射为哈希表
  • 易于解析成各种语言中的数据结构

TOML 已经拥有大多数当今使用的最流行的编程语言的实现:C、C#、C++、Clojure、Dart、Elixir、Erlang、Go、Haskell、Java、Javascript、Lua、Objective-C、Perl、PHP、Python、Ruby、Swift、Scala……以及更多。


常用语法

  • TOML 是大小写敏感的。
  • TOML 文件必须是合法的 UTF-8 编码的 Unicode 文档。
  • 空白是指制表符(0x09)或空格(0x20)。
  • 换行是指 LF(0x0A)或 CRLF(0x0D 0x0A)

注释

# 这是一个全行注释
key = "value"  # 这是一个行末注释
another = "# 这不是一个注释"

除制表符以外的控制字符(U+0000 至 U+0008,U+000A 至 U+001F,U+007F)不允许出现在注释中

键值对

TOML 文档最基本的构成区块是键值对。

键名在等号的左边而值在右边。键名和键值周围的空白会被忽略。键、等号和值必须在同一行(不过有些值可以跨多行)。

key = "value"
  • 字符串
  • 整数
  • 浮点数
  • 布尔值
  • 坐标日期时刻
  • 各地日期时刻
  • 各地日期
  • 各地时刻
  • 数组
  • 内联表

数组

数组是内含值的方括号。
空白会被忽略。
子元素由逗号分隔。
数组可以包含与键值对所允许的相同数据类型的值。
可以混合不同类型的值。

integers = [ 1, 2, 3 ]
colors = [ "红", "黄", "绿" ]
nested_array_of_ints = [ [ 1, 2 ], [3, 4, 5] ]
nested_mixed_array = [ [ 1, 2 ], ["a", "b", "c"] ]
string_array = [ "所有的", '字符串', """是相同的""", '''类型''' ]

# 允许混合类型的数组
numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ]
contributors = [
  "Foo Bar <[email protected]>",
  { name = "Baz Qux", email = "[email protected]", url = "https://example.com/bazqux" }
]


#数组可以跨行。
#数组的最后一个值后面可以有终逗号(也称为尾逗号)。
#值、逗号、结束括号前可以存在任意数量的换行和注释。
#数组值和逗号之间的缩进被作为空白对待而被忽略。

integers2 = [
  1, 2, 3
]

integers3 = [
  1,
  2, # 这是可以的
]

表(也被称为哈希表或字典)是键值对的集合。
它们由表头定义,连同方括号作为单独的行出现。
看得出表头不同于数组,因为数组只有值。

#在它下方,直至下一个表头或文件结束,都是这个表的键值对。
#表不保证保持键值对的指定顺序。

[table-1]
key1 = "some string"
key2 = 123

[table-2]
key1 = "another string"
key2 = 456

#表名的规则与键名相同
[dog."tater.man"]
type.name = "pug"

#等同于json
{ "dog": { "tater.man": { "type": { "name": "pug" } } } }

内联表

内联表提供了一种更为紧凑的语法来表示表。它们对于分组数据特别有用,否则这些数据很快就会变得冗长。内联表被完整地定义在花括号之中:{ 和 }。 括号中,可以出现零或更多个以逗号分隔的键值对。键值对采取与标准表中的键值对相同的形式。什么类型的值都可以,包括内联表。

内联表得出现在同一行内。内联表中,最后一对键值对后不允许终逗号(也称为尾逗号)。不允许花括号中出现任何换行,除非在值中它们合法。即便如此,也强烈不建议把一个内联表搞成纵跨多行的样子。如果你发现自己真的需要,那意味着你应该使用标准表

name = { first = "Tom", last = "Preston-Werner" }
point = { x = 1, y = 2 }
animal = { type.name = "pug" }

#等价于
[name]
first = "Tom"
last = "Preston-Werner"

[point]
x = 1
y = 2

[animal]
type.name = "pug"

表数组

这可以通过把表名写在双方括号里的表头来表示。
表头的第一例定义了这个数组及其首个表元素,而后续的每个则在该数组中创建并定义一个新的表元素。
这些表按出现顺序插入该数组。

[[products]]
name = "Hammer"
sku = 738594937

[[products]]  # 数组里的空表

[[products]]
name = "Nail"
sku = 284758393

color = "gray"

#等价于json
{
  "products": [
    { "name": "Hammer", "sku": 738594937 },
    { },
    { "name": "Nail", "sku": 284758393, "color": "gray" }
  ]
}


#任何对表数组的引用都指向该数组里最近定义的表元素。
#这允许你在最近的表内定义子表,甚至子表数组。
[[fruits]]
name = "apple"

[fruits.physical]  # 子表
color = "red"
shape = "round"

[[fruits.varieties]]  # 嵌套表数组
name = "red delicious"

[[fruits.varieties]]
name = "granny smith"

[[fruits]]
name = "banana"

[[fruits.varieties]]
name = "plantain"

#等价于json

{
  "fruits": [
    {
      "name": "apple",
      "physical": {
        "color": "red",
        "shape": "round"
      },
      "varieties": [
        { "name": "red delicious" },
        { "name": "granny smith" }
      ]
    },
    {
      "name": "banana",
      "varieties": [
        { "name": "plantain" }
      ]
    }
  ]
}

解析

关于toml格式的语法解析,参考以下

https://github.com/toml-lang/toml/wiki

python解析

3.11版本安装tomli库

pip install tomli

解析toml

import tomli

#解析字符串
toml_str = """
[[players]]
name = "Lehtinen"
number = 26

[[players]]
name = "Numminen"
number = 27
"""

toml_dict = tomli.loads(toml_str)
assert toml_dict == {
    "players": [{"name": "Lehtinen", "number": 26}, {"name": "Numminen", "number": 27}]
}


#解析配置文本
import tomli

with open("path_to_file/conf.toml", "rb") as f:
    toml_dict = tomli.load(f)

go解析

使用go-toml模块

import "github.com/pelletier/go-toml/v2"


//定义配置文件结构体
type MyConfig struct {
      Version int
      Name    string
      Tags    []string
}


//解析
doc := `
version = 2
name = "go-toml"
tags = ["go", "toml"]
`

var cfg MyConfig
err := toml.Unmarshal([]byte(doc), &cfg)
if err != nil {
      panic(err)
}
fmt.Println("version:", cfg.Version)
fmt.Println("name:", cfg.Name)
fmt.Println("tags:", cfg.Tags)

// Output:
// version: 2
// name: go-toml
// tags: [go toml]

//编码
cfg := MyConfig{
      Version: 2,
      Name:    "go-toml",
      Tags:    []string{"go", "toml"},
}

b, err := toml.Marshal(cfg)
if err != nil {
      panic(err)
}
fmt.Println(string(b))

// Output:
// Version = 2
// Name = 'go-toml'
// Tags = ['go', 'toml']

目前主要是go语言中使用toml格式作为配置文件教多

标签:name,TOML,介绍,键值,数组,简单,go,toml
From: https://blog.51cto.com/u_11555417/6205967

相关文章

  • 并行计算、分布式计算、集群计算和网格计算的介绍,以及主要有哪些区别?
    并行计算(ParallelComputing)并行计算或称平行计算是相对于串行计算来说的。并行计算(ParallelComputing)是指同时使用多种计算资源解决计算问题的过程。为执行并行计算,计算资源应包括一台配有多处理机(并行处理)的计算机、一个与网络相连的计算机专有编号,或者两者结合使用。......
  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之007 week01 02-07 简单的复杂度分析
    1、复杂度分析复杂度分析本身是非常理论化的一个内容,在计算机科学中,有一个专门的学科叫做——计算复杂性理论。很多童鞋看过《算法导论》,这本书的内容很多很强调算法导论。但是实际上,对于普通程序员来说,不需要过度强调理论化的内容。因为工作中更多面对的是实际的软件工程,工程......
  • Typora 1.5.12 (windows/MacOs版) 简单高效且实用的Markdown编辑器
    简介Typora的设计理念非常人性化,与传统编辑器相比,更注重用户的视觉效果和阅读体验。它的编辑界面非常简洁,用户可以就近编辑,随时查看效果,避免频繁地转换预览模式,提高了工作效率和灵活性。此外,Typora软件还提供了诸如内置思维导图、目录和常用快捷键等便捷功能,可以让用户在编辑的......
  • day01-项目介绍&功能实现
    项目介绍&功能实现1.项目介绍&环境搭建一个以社交平台为核心的轻电商项目,功能如下:短信登录、商户查询缓存、优惠券秒杀、达人探店、好友关注、附近的商户、用户签到、UV统计1.1项目架构1.2项目环境搭建1.2.1后端项目搭建mysql的版本采用5.7及以上版本(1)首先创建数据库......
  • GraphPad Prism 9.5.1 for Mac 简单高效的实用性医学绘图分析工具
    GraphPadPrismGraphPadPrism是一款非常实用的统计软件,其功能非常强大,能够帮助用户进行各类科研数据的处理和分析,快速绘制出各种专业的图像和数据报告。GraphPadPrism软件的用户界面非常友好,易于学习和操作,具有多种语言版本,可以帮助全球各地的用户完成科研数据分析工作。该软......
  • 机器学习:XGBoost算法介绍
    动动发财的小手,点个赞吧!1.简介XGBoost(eXtremeGradientBoosting)是一种用于回归、分类和排序的机器学习算法。它是GBDT(GradientBoostingDecisionTrees)的一种高效实现,能够在大规模数据集上运行,并具有很强的泛化能力。XGBoost在2016年KDDCup竞赛中赢得了冠军,也被广泛应......
  • 消息队列的介绍和对比
    一、消息队列的介绍1.1什么是消息队列消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。   消息队列(MessageQueue)是一种应用间的通信方式,是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源传递......
  • JWT的简单使用—扩展(菜鸡随笔)
    JWT的简单使用—扩展(菜鸡随笔)除了基本的身份认证和授权方案,ASP.NETCore还提供了更高级、更全面的身份认证和授权方案,例如自定义身份认证和授权、多因素身份认证、声明式策略等。在本篇文章中,我们将介绍这些高级身份认证和授权方案的实现。声明式策略声明式策略是一种比较灵活......
  • 我的第一个项目(十一) :飞机大战分包完成(简单阐述分包思路以及过程)
    好家伙, 代码已开源Git:https://gitee.com/tang-and-han-dynasties/panghu-planebattle-esm.gitNPM:panghu-planebattle-esm-npm(npmjs.com) 现在,比如说,我用Vue写好了个人博客主页的前端我想在这个主页里面加点东西,让我的博客更缤纷多彩一点我想在他的主页里面......
  • 【Java技术指南】「Unirest编程专题」一起认识一下一个“灰常”优秀的Http工具,让Http
    Unirest-Java是一个轻量级的HTTP客户端库,它提供了简单易用的API,可以帮助Java开发人员快速地发送HTTP请求和处理响应。在本文中,我们将深入探讨Unirest-Java的技术细节和使用方法。Unirest-Java的优点简单易用:Unirest-Java提供了一组简单易用的API,可以帮助Java开发人员快速地发送HTTP......