前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 中如何关闭 http 响应

Go 中如何关闭 http 响应

原创
作者头像
王小明_HIT
修改2021-08-30 10:54:14
1.7K0
修改2021-08-30 10:54:14
举报
文章被收录于专栏:程序员奇点程序员奇点

为什么需要response.Body.Close()

主要是为了避免内存泄漏的问题, 如果 response 不关闭,会导致内存泄漏。

关闭 http 响应

当你使用标准http库发起请求时,你得到一个http的响应变量。如果你不读取响应主体,你依旧需要关闭它。注意对于空的响应你也一定要这么做。对于新的Go开发者而言,这个很容易就会忘掉。

先看段代码:

代码语言:javascript
复制
package main
import (  
    "fmt"
    "net/http"
    "io/ioutil"
)
func main() {  
    resp, err := http.Get("https://api.ipify.org?format=json")
    defer resp.Body.Close()//not ok
    if err != nil {
        fmt.Println(err)
        return
    }
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(body))
}

上面的代码有没有问题呢?

假设上面的代码请求失败了, resp 肯能会是 nil,这样执行就会出现一个 runtime panic, 因为 defer resp.Body.Close()//not 这个 resp 是个nil ,肯定就 panic 了。

那怎么办?

通过在http响应错误处理中添加一个关闭non-nil响应主体的的调用来修复这个问题。另一个方法是使用一个defer调用来关闭所有失败和成功的请求的响应主体。

代码语言:javascript
复制
import (  
    "fmt"
    "net/http"
    "io/ioutil"
)
func main() {  
    resp, err := http.Get("https://api.ipify.org?format=json")
    if resp != nil {
        defer resp.Body.Close()
    }
    if err != nil {
        fmt.Println(err)
        return
    }
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(body))
} 
欢迎关注:程序员财富自由之路

参考资料
  • https://segmentfault.com/a/1190000020086816

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么需要response.Body.Close()
  • 关闭 http 响应
  • 那怎么办?
    • 欢迎关注:程序员财富自由之路
      • 参考资料
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com