Golang 中处理多个错误的最佳实践

我正在编写一些代码来解析 YAML 文件并验证其中的数据。如果找到的值不符合要求,每个解析器都会返回一个错误。现在我正在创建一个错误数组,并将每次调用的返回设置为数组中的不同索引。我当前的实现是有效的,但它似乎是错误的,我想看看是否有更好的方法来实现这一点。


这是一个例子


func createStruct(yamlMap map[interface{}]interface{}) (myStruct, error) {

    errs := make([]error, 6)

    s := myStruct{}


    s.Name, errs[0] = getString(yamlMap, "name", true)

    s.Tag, errs[1] = getIntValidRange(yamlMap, "tag", 1, 4094, true)

    s.TaggedPorts, errs[2] = getStringPortList(yamlMap, "tagged_ports", true)

    s.UntaggedPorts, errs[3] = getStringPortList(yamlMap, "untagged_ports", true)

    s.IP, errs[4] = getIPString(yamlMap, "ip", true)

    s.Netmask, errs[5] = getIPString(yamlMap, "netmask", true)


    return s, structCreateErrorChecker(errs)

}

我不在每个函数之后处理每个错误的原因是因为我想先尝试解析所有内容,然后收集所有错误并记录它们。这就是 structCreateErrorChecker() 所做的。


这是我试图解析的 YAML(它出现在评论中)。当我说动态时,我的意思是可以有任意数量的这些 controlling_bridge 部分,每个 vlan 部分可以有任意数量的 vlan。


controlling_bridge_1:

    ip:    "1.1.1.1"

    ports: ["1","2"]

    vlans:

        vlan01:

            name:  "vlan1"

            tag:   1001

            ports: ["1"]

            ip:    "2.2.2.2"

        vlan02:

            name:  "vlan02"

            tag:   1002

            ports: ["3", "4"]

            ip:    "3.3.3.1"


controlling_bridge_2:

    ip:    "1.1.1.1"

    ports: ["1","2"]

    vlans:

        vlan01:

            name:  "vlan1"

            tag:   1001

            ports: ["1"]

            ip:    "2.2.2.2"

        vlan02:

            name:  "vlan02"

            tag:   1002

            ports: ["3", "4"]

            ip:    "3.3.3.1"


慕标5832272
浏览 87回答 1
1回答

翻翻过去那场雪

没有官方的 yaml 库,但是gopkg.in/yaml.v2是一个不错的选择。要解组给定的 yaml,您可以定义结构并将 yaml 标签添加到属性中。通过为网桥和 vlan 使用映射并为端口使用数组,您可以毫无问题地解组数据。当您使用地图时,请记住迭代地图并不能保证返回元素的顺序。该程序将解组您给定的结构:package mainimport (    "fmt"    "log"    yaml "gopkg.in/yaml.v2")var data = `controlling_bridge_1:    ip:    "1.1.1.1"    ports: ["1","2"]    vlans:        vlan01:            name:  "vlan1"            tag:   1001            ports: ["1"]            ip:    "2.2.2.2"        vlan02:            name:  "vlan02"            tag:   1002            ports: ["3", "4"]            ip:    "3.3.3.1"controlling_bridge_2:    ip:    "1.1.1.1"    ports: ["1","2"]    vlans:        vlan01:            name:  "vlan1"            tag:   1001            ports: ["1"]            ip:    "2.2.2.2"        vlan02:            name:  "vlan02"            tag:   1002            ports: ["3", "4"]            ip:    "3.3.3.1"`type Bridge struct {    IP    string   `yaml:"ip"`    Ports []string `yaml:"ports"`    Vlans map[string]Vlan}type Vlan struct {    Name  string   `yaml:"name"`    Tag   string   `yaml:"tag"`    Ports []string `yaml:"ports"`    IP    string   `yaml:"ip"`}func main() {    bridges := map[string]Bridge{}    err := yaml.Unmarshal([]byte(data), &bridges)    if err != nil {        log.Fatalf("error: %v", err)    }    fmt.Printf("%+v\n", bridges)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go