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
    }

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

  • 相关阅读:
    Linked List Cycle leetcode java (链表检测环)
    Remove Duplicates from Sorted List II leetcode java
    Remove Duplicates from Sorted List leetcode java
    Merge Two Sorted Lists leetcode java
    Swap Nodes in Pairs leetcode java
    Median of Two Sorted Array leetcode java
    阿里云最便宜的四种域名注册
    nohup和&后台运行,进程查看及终止
    ipv6转ipv4 NAT64与DNS64基本原理概述
    ros使用pppoe拨号获取ipv6,并且下发IPV6的dns到客户机win7
  • 原文地址:https://www.cnblogs.com/ghj1976/p/4082323.html
Copyright © 2011-2022 走看看