Golang 的 TOML库

TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner。

TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。

 

TOML 的Spec https://github.com/toml-lang/toml 
中文版: http://segmentfault.com/a/1190000000477752 

 

Golang的解析库很多:


对比后,推荐:https://github.com/BurntSushi/toml 

更新是16天前的,而且支持把配置文件反序列化成类对象,把类对象序列号成配置文件。而且关注的人也多。

下面是 https://github.com/BurntSushi/toml 的例子翻译:

比如下面的配置文件:

Age = 25
Cats = [ "Cauchy", "Plato" ]
Pi = 3.14
Perfection = [ 6, 28, 496, 8128 ]
DOB = 1987-07-05T05:45:00Z

对应的Go类如下:

type Config struct {
  Age int
  Cats []string
  Pi float64
  Perfection []int
  DOB time.Time // requires `import time`
}

读取配置文件的代码如下:

var conf Config
if _, err := toml.Decode(tomlData, &conf); err != nil {
  // handle error
}
如果我们配置文件中字段名和类的名称无法映射,则可以使用 struct tags

比如,配置文件为:

some_key_NAME = "wat"

对应的Go类如下:

type TOML struct {
  ObscureKey string `toml:"some_key_NAME"`
}

下面是一个例子,自动把duration 字符串解析成 time.Duration 对象

配置文件:

[[song]]
name = "Thunder Road"
duration = "4m49s"

[[song]]
name = "Stairway to Heaven"
duration = "8m03s"

对应Go类如下:

type song struct {
  Name     string
  Duration duration
}
type songs struct {
  Song []song
}
var favorites songs
if _, err := toml.Decode(blob, &favorites); err != nil {
  log.Fatal(err)
}

for _, s := range favorites.Song {
  fmt.Printf("%s (%s)
", s.Name, s.Duration)
}

这里我们需要 让duration 类型满足 encoding.TextUnmarshaler 接口

type duration struct {
    time.Duration
}

func (d *duration) UnmarshalText(text []byte) error {
    var err error
    d.Duration, err = time.ParseDuration(string(text))
    return err
}

对于TOML官方的例子处理如下:

配置文件:

# This is a TOML document. Boom.

title = "TOML Example"

[owner]
name = "Tom Preston-Werner"
organization = "GitHub"
bio = "GitHub Cofounder & CEO
Likes tater tots and beer."
dob = 1979-05-27T07:32:00Z # First class dates? Why not?

[database]
server = "192.168.1.1"
ports = [ 8001, 8001, 8002 ]
connection_max = 5000
enabled = true

[servers]

  # You can indent as you please. Tabs or spaces. TOML don't care.
  [servers.alpha]
  ip = "10.0.0.1"
  dc = "eqdc10"

  [servers.beta]
  ip = "10.0.0.2"
  dc = "eqdc10"

[clients]
data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it

# Line breaks are OK when inside arrays
hosts = [
  "alpha",
  "omega"
]

对应的Go类如下:

type tomlConfig struct {
    Title string
    Owner ownerInfo
    DB database `toml:"database"`
    Servers map[string]server
    Clients clients
}

type ownerInfo struct {
    Name string
    Org string `toml:"organization"`
    Bio string
    DOB time.Time
}

type database struct {
    Server string
    Ports []int
    ConnMax int `toml:"connection_max"`
    Enabled bool
}

type server struct {
    IP string
    DC string
}

type clients struct {
    Data [][]interface{}
    Hosts []string
}

注意,这里是不区分大小写的匹配。

原文地址:https://www.cnblogs.com/ghj1976/p/4082323.html