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

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

動態 JSON 解碼

動態 JSON 解碼

Go
蠱毒傳說 2022-05-05 17:54:22
我有這個函數來解析 HTTP 結果:func (a *Admin) ResponseDecode(structName string, body io.Reader) (interface{}, error) {content, err := ioutil.ReadAll(body)if err != nil {    return nil, err}switch structName {case "[]Cat":    var data []Cat    err = json.Unmarshal(content, &data)    if err != nil {        return nil, err    }    return data, errcase "[]Dog":    var data []Dog    err = json.Unmarshal(content, &data)    if err != nil {        return nil, err    }    return data, errdefault:    log.Fatal("Can't decode " + structName)}return nil, nil}我在這個方法之后做了一個類型斷言:parsed, err := a.ResponseDecode("[]Cat", resp.Body)if err != nil {    return nil, err}return parsed.([]Cat), nil但是我該怎么做才能避免代碼的重復:var data []Stufferr = json.Unmarshal(content, &data)if err != nil {    return nil, err}return data, err每次我添加一個對象?通常我會使用泛型,但這是 Go。這樣做的好方法是什么?
查看完整描述

2 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

您正在傳遞結構的名稱,然后期待該類型的數據。相反,您可以簡單地傳遞結構:


var parsed []Cat

err := a.ResponseDecode(&parsed, resp.Body)

在哪里:


func (a *Admin) ResponseDecode(out interface{}, body io.Reader)  error {

  content, err := ioutil.ReadAll(body)

   if err != nil {

      return nil, err  

   }

  return json.Unmarshal(content,out)

}

實際上,您可以擺脫ResponseDecode功能:


var parsed []Cat

err:=json.NewDecoder(body).Decode(&parsed)


查看完整回答
反對 回復 2022-05-05
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

在這里找到了我要找的東西。此功能完成工作:


func (a *Admin) ResponseDecode(body io.Reader, value interface{}) (interface{}, error) {

content, err := ioutil.ReadAll(body)


if err != nil {

    return nil, err

}


err = json.Unmarshal(content, &value)


if err != nil {

    return nil, err

}


return value, nil}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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