为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕标5832272 2023-04-17 16:27:44
我正在编写一些代码来解析 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"
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

没有官方的 yaml 库,但是gopkg.in/yaml.v2是一个不错的选择。要解组给定的 yaml,您可以定义结构并将 yaml 标签添加到属性中。


通过为网桥和 vlan 使用映射并为端口使用数组,您可以毫无问题地解组数据。


当您使用地图时,请记住迭代地图并不能保证返回元素的顺序。


该程序将解组您给定的结构:


package main


import (

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

}



查看完整回答
反对 回复 2023-04-17
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信