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")
}

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ò)它的方法。
- 2 回答
- 0 關(guān)注
- 95 瀏覽
添加回答
舉報(bào)