3 回答
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查看更多示例
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)
}
}
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
谢谢!
- 3 回答
- 0 关注
- 343 浏览
添加回答
举报