为 TOML 文件和 golang 解析 table 中的键值对
Parsing a key value pair within a table for TOML file and golang
我的 TOML 文件结构如下:
[database]
host = "localhost"
port = 8086
https = true
username = "root"
password = "root"
db = "test"
[cloud]
deviceType = "2be386e9bbae"
deviceId = "119a705fa3b1"
password = "test"
token = "dqpx5vNLLTR34"
endpoint = "mqtts://mqtt1.endpoint.com"
[gps]
#measurement = "gps"
[gps.msgpack]
topic = "/evt/gps/msgpack"
[gps.json]
topic = "/evt/gps/json"
[imu]
#measurement = "imu"
[imu.1]
tag = "NODE1"
topic = "/evt/imu1/msgpack"
[imu.2]
tag = "NODE2"
topic = "/evt/imu2/msgpack"
我只想在 gps
table 和 imu
table 中设置 measurement
键一次,而不是在 msgpack
和 json
和 1
和 2
使用注释掉的键以下代码有效
代码
package main
import (
"fmt"
"github.com/BurntSushi/toml"
)
type imu struct {
Topic string
Measurement string
Tag string
}
type gps struct {
// Measurement string
Measurement string
ETopic string `toml:"topic"`
}
type database struct {
Host string
Port int
Https bool
Username string
Password string
Dbname string
}
type cloud struct {
Devicetype string
DeviceId string
Password string
Token string
Endpoint string
}
type tomlConfig struct {
DB database `toml:"database"`
Cloud cloud `toml:"cloud"`
Gps map[string]gps `toml:"gps"`
Imu map[string]imu `toml:"imu"`
}
func main() {
var config tomlConfig
if _, err := toml.DecodeFile("cloud.toml", &config); err != nil {
fmt.Println(err)
return
}
// fmt.Printf("%#v\n", config)
for sensorName, sensor := range config.Imu {
fmt.Printf("Topic: %s %s %s %s\n", sensorName, sensor.Topic, sensor.Tag, sensor.Measurement)
}
for types, gps := range config.Gps {
fmt.Printf("%s\n", types)
fmt.Printf("%s\n", gps.ETopic)
}
}
然而,在取消注释键值对时,我得到以下信息:
toml: type mismatch for main.gps: expected table but found string
(它应该仍然是一个有效的 TOML,因为我将它翻译成 JSON 并检查了结构)
我知道我在 struct
中没有提到我需要为它添加一个字符串。但是我对结构现在应该是什么样子感到困惑。
你说:
I want to set measurement key in gps table and imutable only once and not redundantly within msgpack and json and for 1 and 2
你不做这个是因为 TOML 格式的创建者说:
Because we need a decent human-readable format that unambiguously maps to a hash table and the YAML spec is like 80 pages long and gives me rage. No, JSON doesn't count. You know why.
如果您需要对一个键具有相同的值,例如measurement
,您必须在每个子表中指定您想要的值
您的正确 TOML 文件:
[database]
host = "localhost"
port = 8086
https = true
username = "root"
password = "root"
db = "test"
[cloud]
deviceType = "2be386e9bbae"
deviceId = "119a705fa3b1"
password = "test"
token = "dqpx5vNLLTR34"
endpoint = "mqtts://mqtt1.endpoint.com"
[gps]
[gps.msgpack]
topic = "/evt/gps/msgpack"
measurement = "gps"
[gps.json]
topic = "/evt/gps/json"
measurement = "gps"
[imu]
[imu.1]
measurement = "imu"
tag = "NODE1"
topic = "/evt/imu1/msgpack"
[imu.2]
measurement = "imu"
tag = "NODE2"
topic = "/evt/imu2/msgpack"
我的 TOML 文件结构如下:
[database]
host = "localhost"
port = 8086
https = true
username = "root"
password = "root"
db = "test"
[cloud]
deviceType = "2be386e9bbae"
deviceId = "119a705fa3b1"
password = "test"
token = "dqpx5vNLLTR34"
endpoint = "mqtts://mqtt1.endpoint.com"
[gps]
#measurement = "gps"
[gps.msgpack]
topic = "/evt/gps/msgpack"
[gps.json]
topic = "/evt/gps/json"
[imu]
#measurement = "imu"
[imu.1]
tag = "NODE1"
topic = "/evt/imu1/msgpack"
[imu.2]
tag = "NODE2"
topic = "/evt/imu2/msgpack"
我只想在 gps
table 和 imu
table 中设置 measurement
键一次,而不是在 msgpack
和 json
和 1
和 2
使用注释掉的键以下代码有效
代码
package main
import (
"fmt"
"github.com/BurntSushi/toml"
)
type imu struct {
Topic string
Measurement string
Tag string
}
type gps struct {
// Measurement string
Measurement string
ETopic string `toml:"topic"`
}
type database struct {
Host string
Port int
Https bool
Username string
Password string
Dbname string
}
type cloud struct {
Devicetype string
DeviceId string
Password string
Token string
Endpoint string
}
type tomlConfig struct {
DB database `toml:"database"`
Cloud cloud `toml:"cloud"`
Gps map[string]gps `toml:"gps"`
Imu map[string]imu `toml:"imu"`
}
func main() {
var config tomlConfig
if _, err := toml.DecodeFile("cloud.toml", &config); err != nil {
fmt.Println(err)
return
}
// fmt.Printf("%#v\n", config)
for sensorName, sensor := range config.Imu {
fmt.Printf("Topic: %s %s %s %s\n", sensorName, sensor.Topic, sensor.Tag, sensor.Measurement)
}
for types, gps := range config.Gps {
fmt.Printf("%s\n", types)
fmt.Printf("%s\n", gps.ETopic)
}
}
然而,在取消注释键值对时,我得到以下信息:
toml: type mismatch for main.gps: expected table but found string
(它应该仍然是一个有效的 TOML,因为我将它翻译成 JSON 并检查了结构)
我知道我在 struct
中没有提到我需要为它添加一个字符串。但是我对结构现在应该是什么样子感到困惑。
你说:
I want to set measurement key in gps table and imutable only once and not redundantly within msgpack and json and for 1 and 2
你不做这个是因为 TOML 格式的创建者说:
Because we need a decent human-readable format that unambiguously maps to a hash table and the YAML spec is like 80 pages long and gives me rage. No, JSON doesn't count. You know why.
如果您需要对一个键具有相同的值,例如measurement
,您必须在每个子表中指定您想要的值
您的正确 TOML 文件:
[database]
host = "localhost"
port = 8086
https = true
username = "root"
password = "root"
db = "test"
[cloud]
deviceType = "2be386e9bbae"
deviceId = "119a705fa3b1"
password = "test"
token = "dqpx5vNLLTR34"
endpoint = "mqtts://mqtt1.endpoint.com"
[gps]
[gps.msgpack]
topic = "/evt/gps/msgpack"
measurement = "gps"
[gps.json]
topic = "/evt/gps/json"
measurement = "gps"
[imu]
[imu.1]
measurement = "imu"
tag = "NODE1"
topic = "/evt/imu1/msgpack"
[imu.2]
measurement = "imu"
tag = "NODE2"
topic = "/evt/imu2/msgpack"