(Go) 如何使用 toml 文件?

作为标题,我想知道如何使用 golang 中的 toml 文件。


在此之前,我展示了我的 toml 示例。这样对吗?


[datatitle]

enable = true

userids = [

    "12345", "67890"

]

    [datatitle.12345]

    prop1 = 30

    prop2 = 10


    [datatitle.67890]

    prop1 = 30

    prop2 = 10

然后,我想将这些数据设置为结构类型。


因此,我想访问子元素,如下所示。


datatitle["12345"].prop1

datatitle["67890"].prop2

提前致谢!


慕莱坞森
浏览 344回答 3
3回答

阿晨1998

首先获取BurntSushi的toml解析器:go get github.com/BurntSushi/tomlBurntSushi 解析 toml 并将其映射到结构体,这就是您想要的。然后执行下面的例子并从中学习:package mainimport (    "github.com/BurntSushi/toml"    "log")var tomlData = `title = "config"[feature1]enable = trueuserids = [  "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查看更多示例

阿波罗的战车

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)    }}

ABOUTYOU

此问题已使用推荐的 pkg BurntSushi/toml 解决!!我做了如下,它是代码的一部分。[toml 示例][title]enable = true[title.clientinfo.12345]distance = 30some_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谢谢!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go