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

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

如何使用Go中接口數組中的值初始化結構?

如何使用Go中接口數組中的值初始化結構?

Go
慕沐林林 2022-09-05 18:00:00
我從服務器收到一條消息,如[0,“on”,[6,1,5,“market”,45.7]],并將其保存到[]interface{}變量。我想用這個數組的值初始化結構。我對Go來說是全新的,并嘗試這樣做:import "golang.org/x/net/websocket"...var msg []interface{}// Server send response: `[0,"on",[6,1,5,"market",45.7]]`if err := websocket.Message.Receive(ws, &msg); err != nil {    logger.Println(err)} else {    type Order struct {        ID int32,        GID int32,        CID int32,        Type string,        Amount float64    }        // here msg is [0,"on",[6,1,5,"market",45.7]]        switch msg[1] {    case "on":        if rawOrder, ok := msg[2].([]interface{}); ok {            order := Order{int32(rawOrder[0]), int32(rawOrder[1]), int32(rawOrder[2]), string(rawOrder[3]), float64(rawOrder[4])}        }}但是我收到一個錯誤“無法將'interface{}'類型的表達式轉換為'int32'”類型,下一步是為每個rawOrder[i]類型使用switch,但它太長了。我怎樣才能輕松做到?
查看完整描述

1 回答

?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

如果您知道websocket上使用的編解碼器將始終是json,則可以正式定義并為其提供一個函數來為您進行解碼。OrderUnmarshalJSON


import "golang.org/x/net/websocket"


type Order struct {

    ID, GID, CID int32

    Type         string

    Amount       float64

}


func (o *Order) UnmarshalJSON(data []byte) error {

    var first []json.RawMessage

    err := json.Unmarshal(data, &first)

    if err != nil {

        return fmt.Errorf("invalid order, must be array: %w", err)

    }

    if len(first) != 3 {

        return fmt.Errorf("invalid order, length must be 3, got %d", len(first))

    }


    var second string

    err = json.Unmarshal(first[1], &second)

    if err != nil {

        return fmt.Errorf("invalid order, second element must be string: %w", err)

    }


    switch second {

    case "on":

        var third []json.RawMessage

        err = json.Unmarshal(first[2], &third)

        if err != nil {

            return fmt.Errorf("invalid order, third element must be array: %w", err)

        }


        if len(third) != 5 {

            return fmt.Errorf("invalid order, element 3 length must be 5, got %d", len(third))

        }


        for i, f := range []interface{}{&o.ID, &o.GID, &o.CID, &o.Type, &o.Amount} {

            err = json.Unmarshal(third[i], f)

            if err != nil {

                return fmt.Errorf("invalid order, wrong type for element 3[%d]: %w", i, err)

            }

        }

        return nil

    }


    return fmt.Errorf("invalid order, unknown type %q", second)

}


...

var msg *Order

// Server send response: `[0,"on",[6,1,5,"market",45.7]]`

if err := websocket.JSON.Receive(ws, &msg); err != nil {

    logger.Println(err)

}


// msg is now an &Order{ID:6, GID:1, CID:5, Type:"market", Amount:45.7}


}

該功能之所以巨大,是因為您的API很糟糕。如果您控制服務器;那么你應該避免在同一數組中使用混合類型,你應該避免對關系數據使用數組。UnmarshalJSON


查看完整回答
反對 回復 2022-09-05
  • 1 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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