第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何解析 ovs-vsctl 的結(jié)果獲取接口 <interface> 統(tǒng)計信息

如何解析 ovs-vsctl 的結(jié)果獲取接口 <interface> 統(tǒng)計信息

Go
忽然笑 2021-11-15 16:08:50
結(jié)果示例:{collisions=0, rx_bytes=258, rx_crc_err=0, rx_dropped=0, rx_errors=0, rx_frame_err=0, rx_over_err=0, rx_packets=3, tx_bytes=648, tx_dropped=0, tx_errors=0, tx_packets=8}這種格式類似于 JSON,但不是 JSON。有沒有一種簡單的方法可以將其解析為map[string]int?喜歡json.Unmarshal(data, &value)。
查看完整描述

2 回答

?
紅糖糍粑

TA貢獻(xiàn)1815條經(jīng)驗 獲得超6個贊

如果該傳輸格式不是遞歸定義的,即一個鍵不能啟動一個子結(jié)構(gòu),那么它的語言是常規(guī)的。因此,您可以使用 Go 的標(biāo)準(zhǔn)regexp包來解析它:


package main


import (

    "fmt"

    "regexp"

    "strconv"

)


const data = `{collisions=0, rx_bytes=258, rx_crc_err=0, rx_dropped=0, rx_errors=0, rx_frame_err=0, rx_over_err=0, rx_packets=3, tx_bytes=648, tx_dropped=0, tx_errors=0, tx_packets=8}`


const regex = `([a-z_]+)=([0-9]+)`


func main() {

    ms := regexp.MustCompile(regex).FindAllStringSubmatch(data, -1)


    vs := make(map[string]int)


    for _, m := range ms {

        v, _ := strconv.Atoi(m[2])

        vs[m[1]] = v

    }


    fmt.Printf("%#v\n", vs)

}


查看完整回答
反對 回復(fù) 2021-11-15
?
慕后森

TA貢獻(xiàn)1802條經(jīng)驗 獲得超5個贊

您可以通過使用strings.Split()以逗號空格 ( ", ")分割以獲得對,然后再次使用等號 ( "=")分割以獲得鍵值對來獲得更有效的解決方案。之后,您只需要將這些放入地圖中:


func Parse(s string) (m map[string]int, err error) {

    if len(s) < 2 || s[0] != '{' || s[len(s)-1] != '}' {

        return nil, fmt.Errorf("Invalid input, no wrapping brackets!")

    }


    m = make(map[string]int)

    for _, v := range strings.Split(s[1:len(s)-1], ", ") {

        parts := strings.Split(v, "=")

        if len(parts) != 2 {

            return nil, fmt.Errorf("Equal sign not found in: %s", v)

        }

        if m[parts[0]], err = strconv.Atoi(parts[1]); err != nil {

            return nil, err

        }

    }

    return

}

使用它:


s := "{collisions=0, rx_bytes=258, ...}"


fmt.Println(Parse(s))

在Go Playground.


注意:如果性能很重要,可以通過不strings.Split()在外循環(huán)中使用,而是“手動”搜索逗號并維護(hù)索引,并且僅“取出”代表實際鍵和值的子字符串來改進(jìn)這一點(但此解決方案將更復(fù)雜)。


另一個解決方案...

...但此選項要慢得多,因此只有在性能不是關(guān)鍵要求時才可行:您可以將輸入字符串轉(zhuǎn)換為有效的 JSON 格式,然后您可以使用json.Unmarshal(). 省略了錯誤檢查:


s := "{collisions=0, rx_bytes=258, ...}"


// Turn into valid JSON:

s = strings.Replace(s, `=`, `":`, -1)

s = strings.Replace(s, `, `, `, "`, -1)

s = strings.Replace(s, `{`, `{"`, -1)


// And now simply unmarshal:

m := make(map[string]int)

json.Unmarshal([]byte(s), &m)

fmt.Println(m)

此解決方案的優(yōu)點是,如果您解組的目標(biāo)值是 a ,這也有效struct:


// Unmarshal into a struct (you don't have to care about all fields)

st := struct {

    Collisions int `json:"collisions"`

    Rx_bytes   int `json:"rx_bytes"`

}{}

json.Unmarshal([]byte(s), &st)

fmt.Printf("%+v\n", st)

在Go Playground.


查看完整回答
反對 回復(fù) 2021-11-15
  • 2 回答
  • 0 關(guān)注
  • 382 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號