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

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

從通用且以某種方式動態(tài)的 go 地圖獲取內(nèi)容的最佳方式是什么?

從通用且以某種方式動態(tài)的 go 地圖獲取內(nèi)容的最佳方式是什么?

Go
斯蒂芬大帝 2022-06-13 16:16:19
我有這個 json 可以轉(zhuǎn)換為:var leerCHAT []interface{}但是我正在經(jīng)歷瘋狂的箍來到達(dá)地圖內(nèi)部和地圖內(nèi)部瘋狂的地圖上的任何點,特別是因為有些結(jié)果是不同的內(nèi)容。這是Json[   null,   null,   "hub:zWXroom",   "presence_diff",   {      "joins":{         "f718a187-6e96-4d62-9c2d-67aedea00000":{            "metas":[               {                  "context":{},                  "permissions":{},                  "phx_ref":"zNDwmfsome=",                  "phx_ref_prev":"zDMbRTmsome=",                  "presence":"lobby",                  "profile":{},                  "roles":{}               }            ]         }      },      "leaves":{}   }]我需要進(jìn)入配置文件,然后里面有一個“DisplayName”字段。所以我一直在做瘋狂的黑客攻擊..即使這樣我也被卡住了一半......首先是一個數(shù)組,所以我可以做一些事情[elementnumber] 然后是當(dāng)棘手的映射開始時......對所有打印等感到抱歉,是為了調(diào)試并查看我要返回的元素數(shù)量。if leerCHAT[3] == "presence_diff" {                var id string                presence := leerCHAT[4].(map[string]interface{})                log.Printf("algo: %v", len(presence))                log.Printf("algo: %s", presence["joins"])                vamos := presence["joins"].(map[string]interface{})                for i := range vamos {                    log.Println(i)                    id = i                }                log.Println(len(vamos))                vamonos := vamos[id].(map[string]interface{})                log.Println(vamonos)                log.Println(len(vamonos))                metas := vamonos["profile"].(map[string]interface{})   \\\ I get error here..                log.Println(len(metas))            }到目前為止,我可以一直看到 meta:{...} 但無法繼續(xù)將我的 hacky 代碼用于我需要的內(nèi)容。注意:因為在 Joins: 和 metas: 之前的 id 是動態(tài)的,所以我必須以某種方式獲取它,因為它始終只是一個元素,我做了 for range 循環(huán)來抓取它。
查看完整描述

1 回答

?
弒天下

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

索引 3 處的數(shù)組元素描述了索引 4 處的變體 JSON 的類型。


以下是如何將 JSON 解碼為 Go 值。首先,為 JSON 的每個變體部分聲明 Go 類型:


type PrescenceDiff struct {

     Joins map[string]*Presence // declaration of Presence type to be supplied

     Leaves map[string]*Presence

}


type Message struct {

     Body string

}

聲明一個將類型字符串與 Go 類型相關(guān)聯(lián)的映射:


var messageTypes = map[string]reflect.Type{

    "presence_diff": reflect.TypeOf(&PresenceDiff{}),

    "message":       reflect.TypeOf(&Message{}),

    // add more types here as needed

}

將變體部分解碼為原始消息。使用索引 3 處的元素中的名稱來創(chuàng)建適當(dāng) Go 類型的值并解碼為該值:


func decode(data []byte) (interface{}, error) {

    var messageType string

    var raw json.RawMessage

    v := []interface{}{nil, nil, nil, &messageType, &raw}

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

    if err != nil {

        return nil, err

    }


    if len(raw) == 0 {

        return nil, errors.New("no message")

    }


    t := messageTypes[messageType]

    if t == nil {

        return nil, fmt.Errorf("unknown message type: %q", messageType)

    }


    result := reflect.New(t.Elem()).Interface()

    err = json.Unmarshal(raw, result)

    return result, err

}

使用類型開關(guān)訪問消息的變體部分:


defer ws.Close()


for {

    _, data, err := ws.ReadMessage()

    if err != nil {

        log.Printf("Read error: %v", err)

        break

    }


    v, err := decode(data)

    if err != nil {

        log.Printf("Decode error: %v", err)

        continue

    }


    switch v := v.(type) {

    case *PresenceDiff:

        fmt.Println(v.Joins, v.Leaves)

    case *Message:

        fmt.Println(v.Body)

    default:

        fmt.Printf("type %T not handled\n", v)

    }

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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