亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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條經驗 獲得超14個贊

沒有官方的 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 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號