什么';创建go结构以解组以下yaml文件的更好方法是什么?

什么';创建go结构以解组以下yaml文件的更好方法是什么?,go,yaml,snmp,gosnmp,Go,Yaml,Snmp,Gosnmp,我正在解组一个yaml文件snmp.yml。我想知道我是否能得到关于创建更好结构的建议。 这就是我现在所拥有的,但是我猜我为Metric创建的结构是好的,但是SNMPyaml需要更好的重构,以完全能够正确地使用未经授权的数据 如有任何建议/反馈,我们将不胜感激。提前谢谢你 包装系统 进口( “fmt” “io/ioutil” “日志” “路径/文件路径” y“gopkg.in/yaml.v2” ) //SNMPyaml结构 类型SNMPyaml结构{ Metrics Metric`yaml:“M

我正在解组一个yaml文件snmp.yml。我想知道我是否能得到关于创建更好结构的建议。 这就是我现在所拥有的,但是我猜我为Metric创建的结构是好的,但是SNMPyaml需要更好的重构,以完全能够正确地使用未经授权的数据

如有任何建议/反馈,我们将不胜感激。提前谢谢你

包装系统
进口(
“fmt”
“io/ioutil”
“日志”
“路径/文件路径”
y“gopkg.in/yaml.v2”
)
//SNMPyaml结构
类型SNMPyaml结构{
Metrics Metric`yaml:“Metrics”`
}
//公制可导出
类型度量结构{
名称字符串`yaml:“名称,省略为空”`
Oid字符串'yaml:'Oid'`
类型字符串`yaml:“类型”`
帮助字符串`yaml:“帮助,省略空”`
}
//YamlPasser
func Yamlparser(){
//读取snmp.yml文件
absPath,:=filepath.Abs(“./app/snmp.yml”)
yamlFile,yamlerror:=ioutil.ReadFile(absPath)
如果yamlerror!=零{
log.Fatalf(“ioutil错误:%v”,yamlerror)
}
//解开
var c SNMPyaml
错误:=y.Unmarshal(yamlFile和c)
如果错误!=零{
log.Fatal(错误)
}
格式打印(c)
}
我得到的错误是:

    2019/07/31 23:25:58 yaml: line 25: mapping values are not allowed in this context
    exit status 1

在您的输入中,
metrics
是一个序列(列表),因此您无法将其封送到单个
Metric
。使用切片:
[]度量标准

type SNMPyaml struct {
    Metrics []Metric `yaml:"metrics"`
}
还有一个
索引
字段,这是另一个序列,在
度量
结构中没有相应的字段,并且有一个不必要的
帮助
(至少在您提供的输入中没有这样的字段):

其中,可以使用此结构对索引进行建模:

type Index struct {
    LabelName string `yaml:"labelname"`
    Type      string `yaml:"type"`
}
通过这些更改,它将运行,在上尝试,并生成以下输出:

{{sysStatClientCurConns 1.3.6.1.4.1.3375.2.1.1.2.1.8 gauge[{sysStatClientCurConns gauge}}{sysClientsslStatCurConns 1.3.6.1.4.1.3375.2.1.1.2.9.2 gauge[{sysClientsslStatCurConns gauge}}}}{sysClientSslStatTotNativeConns 1.3.6.1.4.1.1.1.2.9.6 gauge[}}

还请注意,有一个在线YAML-to-Go转换器,您可以在其中输入YAML源,它会生成Go数据结构,对您的输入进行建模:

生成的代码使用未命名的结构(如果必须创建的值,这是一个难题),但这是一个很好的起点,您可以轻松地将它们重构为命名类型。它根据YAML输入生成以下模型:

type AutoGenerated struct {
    Metrics []struct {
        Name    string `yaml:"name"`
        Oid     string `yaml:"oid"`
        Type    string `yaml:"type"`
        Indexes []struct {
            Labelname string `yaml:"labelname"`
            Type      string `yaml:"type"`
        } `yaml:"indexes"`
    } `yaml:"metrics"`
}

请注意:在这里,你似乎重新发明了轮子。基本上,您使用的DSL与MIB的功能几乎相同。我建议使用类似这样的东西,并使用更简单的YAML文件。
type Index struct {
    LabelName string `yaml:"labelname"`
    Type      string `yaml:"type"`
}
type AutoGenerated struct {
    Metrics []struct {
        Name    string `yaml:"name"`
        Oid     string `yaml:"oid"`
        Type    string `yaml:"type"`
        Indexes []struct {
            Labelname string `yaml:"labelname"`
            Type      string `yaml:"type"`
        } `yaml:"indexes"`
    } `yaml:"metrics"`
}