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

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

如何解碼為嵌入式結(jié)構(gòu)?

如何解碼為嵌入式結(jié)構(gòu)?

Go
侃侃爾雅 2022-06-13 16:09:49
我希望能夠.Decode()在響應(yīng)主體上使用來填充結(jié)構(gòu),而無需首先嘗試找出我應(yīng)該解碼為哪種類型的結(jié)構(gòu)。我有一個通用結(jié)構(gòu)Match來保存有關(guān)已玩游戲的信息,例如 Fortnite 中的一場比賽。在這個結(jié)構(gòu)中,我MatchData用來保存整個游戲的比賽數(shù)據(jù)。解碼到MatchData結(jié)構(gòu)時,我發(fā)現(xiàn)底層嵌入類型已初始化,但具有所有默認(rèn)值,而不是來自響應(yīng)的值。type Match struct {    MatchID       int        `json:"match_id"`    GameType      int        `json:"game_type"`    MatchData     *MatchData `json:"match_data"`}type MatchData struct {    MatchGame1    MatchGame2}type MatchGame1 struct {    X int `json:"x"`    Y int `json:"y"`}type MatchGame2 struct {    X int `json:"x"`    Y int `json:"y"`}func populateData(m *Match) (Match, error) {    response, err := http.Get("game1.com/path")    if err != nil {        return nil, err    }        // Here, m.MatchData is set with X and Y equal to 0    // when response contains values > 0    err = json.NewDecoder(response.Body).Decode(&m.MatchData)    if err != nil {        return nil, err    }    return m, nil}編輯 示例預(yù)期的 JSON 有效負(fù)載。{    "x": 10,    "y": 20}m.GameType我可以通過檢查、創(chuàng)建一個對應(yīng)的結(jié)構(gòu)然后將其分配給來解決這個問題m.MatchData,但是如果我想添加另外 100 個游戲 API,我希望該函數(shù)可以與它無關(guān)。我不確定這是否可能,但在此先感謝。
查看完整描述

1 回答

?
慕運(yùn)維8079593

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

問題中的方法不起作用,因?yàn)榍度胧浇Y(jié)構(gòu)共享字段名稱。試試這個方法。


聲明一個將游戲類型標(biāo)識符與相關(guān)圍棋類型相關(guān)聯(lián)的地圖。這只是與解碼相關(guān)的代碼,它知道數(shù)百種游戲類型。


var gameTypes = map[int]reflect.Type{

    1: reflect.TypeOf(&MatchGame1{}),

    2: reflect.TypeOf(&MatchGame2{}),

}

將匹配數(shù)據(jù)解碼為原始消息。使用游戲類型創(chuàng)建匹配數(shù)據(jù)值并解碼為該值。


func decodeMatch(r io.Reader) (*Match, error) {


    // Start with match data set to a raw messae.

    var raw json.RawMessage

    m := &Match{MatchData: &raw}


    err := json.NewDecoder(r).Decode(m)

    if err != nil {

        return nil, err

    }


    m.MatchData = nil


    // We are done if there's no raw message.

    if len(raw) == 0 {

        return m, nil

    }


    // Create the required match data value.

    t := gameTypes[m.GameType]

    if t == nil {

        return nil, errors.New("unknown game type")

    }

    m.MatchData = reflect.New(t.Elem()).Interface()


    // Decode the raw message to the match data.

    return m, json.Unmarshal(raw, m.MatchData)


}


查看完整回答
反對 回復(fù) 2022-06-13
  • 1 回答
  • 0 關(guān)注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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