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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

空接口是繞過(guò)類(lèi)型系統(tǒng)的一種方式嗎?

空接口是繞過(guò)類(lèi)型系統(tǒng)的一種方式嗎?

Go
慕妹3242003 2022-08-24 20:32:31
我正在學(xué)習(xí)Go(來(lái)自Python),強(qiáng)制打字系統(tǒng)實(shí)際上很有幫助。我對(duì)的了解非常有限,導(dǎo)致我使用以下代碼,其中我從API檢索JSON數(shù)據(jù)并返回解析版本。結(jié)果可以是對(duì)象或?qū)ο罅斜?。interface{}func getJsonFromApi(endpoint string) (reply interface{}, err error) {    res, err := http.Get("http://127.0.0.42/api/" + endpoint)    if err != nil {        return nil, err    }    body, err := ioutil.ReadAll(res.Body)    err = res.Body.Close()    if err != nil {        return nil, err    }    err = json.Unmarshal(body, &reply)    return reply, nil}它有效,但我通過(guò)顛覆類(lèi)型系統(tǒng)感到不舒服。這是 的預(yù)期用法嗎?interface{}我最終會(huì)將代碼更改為始終返回一個(gè)對(duì)象數(shù)組(并在我的第一個(gè)用例中獲取第一個(gè)對(duì)象),但我對(duì)一般問(wèn)題感到好奇。
查看完整描述

2 回答

?
慕萊塢森

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊

如果可能,最好使用 .您可以使用 :structmap


package main


import (

   "encoding/json"

   "net/http"

)


func main() {

   r, e := http.Get("https://github.com/manifest.json")

   if e != nil {

      panic(e)

   }

   defer r.Body.Close()

   m := make(map[string]interface{})

   json.NewDecoder(r.Body).Decode(&m)

   s := m["icons"].([]interface{})[0].(map[string]interface{})["sizes"].(string)

   println(s == "114x114")

}

但是正如你所看到的,當(dāng)你需要解開(kāi)包裝以獲得實(shí)際價(jià)值時(shí),它會(huì)變得非常痛苦。 好多了:struct


package main


import (

   "encoding/json"

   "net/http"

)


func main() {

   r, e := http.Get("https://github.com/manifest.json")

   if e != nil {

      panic(e)

   }

   defer r.Body.Close()

   var m struct {

      Icons []struct { Sizes string }

   }

   json.NewDecoder(r.Body).Decode(&m)

   s := m.Icons[0].Sizes

   println(s == "114x114")

}


查看完整回答
反對(duì) 回復(fù) 2022-08-24
?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊

空接口 是指定零個(gè)方法的接口。它可以保存任何類(lèi)型的值(https://tour.golang.org/methods/14),因此它是您在不知道實(shí)際類(lèi)型的情況下用來(lái)保存某些內(nèi)容的類(lèi)型。interface{}

在像您這樣的示例中,有時(shí)這是必要的,但代價(jià)是強(qiáng)類(lèi)型化。我不認(rèn)為你應(yīng)該在你的例子中使用它感到不舒服,但是如果它最終到處都是,你應(yīng)該開(kāi)始感到不舒服。

您可以允許方法的調(diào)用方傳入實(shí)際類(lèi)型,如果您改用此簽名:

func getJsonFromApi(endpoint string, reply interface{}) (err error) {

我會(huì)說(shuō)它是類(lèi)型系統(tǒng)的一部分,而不是繞過(guò)它的方法。


查看完整回答
反對(duì) 回復(fù) 2022-08-24
  • 2 回答
  • 0 關(guān)注
  • 95 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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