zoukankan      html  css  js  c++  java
  • 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
    }

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

  • 相关阅读:
    逆向入门之路1 关于逆向工程
    EC笔记:第三部分:14、在资源管理类中小心Copying行为
    vuex最简单、最详细的入门文档
    前端加密的几种常见方式
    NAS星云链 入门之从零开发第一个DAPP
    chrome 不支持12px以下字体为题的解决
    input checkbox 多选 验证
    你对javascript的原生操作或者工具了解多少呢?
    ionic2-键盘覆盖输入框和返回键问题解决方案
    ionic2 手风琴效果
  • 原文地址:https://www.cnblogs.com/ghj1976/p/4082323.html
Copyright © 2011-2022 走看看