理想的方法不是使用
ioutil.ReadAll,而是直接在阅读器上使用解码器。这是一个很好的函数,它获取一个 url 并将其响应解码到一个
target结构上。
var myClient = &http.Client{Timeout: 10 * time.Second}func getJson(url string, target interface{}) error { r, err := myClient.Get(url) if err != nil { return err } defer r.Body.Close() return json.NewDeprer(r.Body).Depre(target)}使用示例:
type Foo struct { Bar string}func main() { foo1 := new(Foo) // or &Foo{} getJson("http://example.com", foo1) println(foo1.Bar) // alternately: foo2 := Foo{} getJson("http://example.com", &foo2) println(foo2.Bar)}您不应该
*http.Client像这个答案最初演示的那样在生产中使用默认结构!(这是
http.Get/etc 调用的内容)。原因是默认客户端没有设置超时;如果远程服务器没有响应,那你的日子就不好过了。



