为了账号安全,请及时绑定邮箱和手机立即绑定

(Go) 如何使用 toml 文件?

(Go) 如何使用 toml 文件?

Go
慕莱坞森 2021-11-29 16:28:04
作为标题,我想知道如何使用 golang 中的 toml 文件。在此之前,我展示了我的 toml 示例。这样对吗?[datatitle]enable = trueuserids = [    "12345", "67890"]    [datatitle.12345]    prop1 = 30    prop2 = 10    [datatitle.67890]    prop1 = 30    prop2 = 10然后,我想将这些数据设置为结构类型。因此,我想访问子元素,如下所示。datatitle["12345"].prop1datatitle["67890"].prop2提前致谢!
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

首先获取BurntSushi的toml解析器:


go get github.com/BurntSushi/toml


BurntSushi 解析 toml 并将其映射到结构体,这就是您想要的。


然后执行下面的例子并从中学习:


package main


import (

    "github.com/BurntSushi/toml"

    "log"

)


var tomlData = `title = "config"

[feature1]

enable = true

userids = [

  "12345", "67890"

]


[feature2]

enable = false`


type feature1 struct {

    Enable  bool

    Userids []string

}


type feature2 struct {

    Enable bool

}


type tomlConfig struct {

    Title string

    F1    feature1 `toml:"feature1"`

    F2    feature2 `toml:"feature2"`

}


func main() {

    var conf tomlConfig

    if _, err := toml.Decode(tomlData, &conf); err != nil {

        log.Fatal(err)

    }

    log.Printf("title: %s", conf.Title)

    log.Printf("Feature 1: %#v", conf.F1)

    log.Printf("Feature 2: %#v", conf.F2)

}

注意tomlData以及它如何映射到tomlConfig结构体。


在https://github.com/BurntSushi/toml查看更多示例


查看完整回答
反对 回复 2021-11-29
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

2019 年的一个小更新 - 现在有更新的BurntSushi/toml替代品,具有更丰富的 API 来处理.toml文件:


颗粒/go-toml(和文档)


例如有config.toml文件(或在内存中):


[postgres]

user = "pelletier"

password = "mypassword"

除了使用颗粒/go-toml将整个事物常规编组和解组为预定义结构(您可以在接受的答案中看到)之外,您还可以查询这样的单个值:


config, err := toml.LoadFile("config.toml")


if err != nil {

    fmt.Println("Error ", err.Error())

} else {


    // retrieve data directly


    directUser := config.Get("postgres.user").(string)

    directPassword := config.Get("postgres.password").(string)

    fmt.Println("User is", directUser, " and password is", directPassword)


    // or using an intermediate object


    configTree := config.Get("postgres").(*toml.Tree)

    user := configTree.Get("user").(string)

    password := configTree.Get("password").(string)

    fmt.Println("User is", user, " and password is", password)


    // show where elements are in the file


    fmt.Printf("User position: %v\n", configTree.GetPosition("user"))

    fmt.Printf("Password position: %v\n", configTree.GetPosition("password"))


    // use a query to gather elements without walking the tree


    q, _ := query.Compile("$..[user,password]")

    results := q.Execute(config)

    for ii, item := range results.Values() {

        fmt.Println("Query result %d: %v", ii, item)

    }

}


查看完整回答
反对 回复 2021-11-29
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

此问题已使用推荐的 pkg BurntSushi/toml 解决!!我做了如下,它是代码的一部分。


[toml 示例]


[title]

enable = true

[title.clientinfo.12345]

distance = 30

some_id = 6

【Golang示例】


type TitleClientInfo struct {

    Distance int    `toml:"distance"`

    SomeId  int     `toml:"some_id"`

}


type Config struct {

    Enable     bool     `toml:"enable"`

    ClientInfo map[string]TitleClientInfo `toml:"clientinfo"`

}


var config Config

_, err := toml.Decode(string(d), &config)

然后,它可以按我的预期使用。


config.ClientInfo[12345].Distance

谢谢!


查看完整回答
反对 回复 2021-11-29
  • 3 回答
  • 0 关注
  • 343 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信