专栏首页程序员财富自由之路Go 中如何关闭 http 响应
原创

Go 中如何关闭 http 响应

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

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

关闭 http 响应

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

先看段代码:

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调用来关闭所有失败和成功的请求的响应主体。

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go 中如何关闭 Http 响应

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

    王小明_HIT
  • EasyDSS/EasyNTS通过Golang使用http如何优化响应body未关闭的问题?

    我们大多数平台都是用的Golang进行编译的,在很多视频流媒体软件比如EasyDSS、EasyNTS等产品的编译中,经常会出现要使用http接口访问其他服务的接...

    TSINGSEE青犀视频
  • 如何优雅地关闭Go channel

    本文译自:How To Close Channels in Golang Elegantly。 几天前,我写了一篇文章来说明golang中channel的使用规...

    李海彬
  • 如何优雅地关闭Go channel

    本文译自:How To Close Channels in Golang Elegantly[https://go101.org/article/channel...

    我的小碗汤
  • 如何优雅地关闭Go channel

    本文译自:How To Close Channels in Golang Elegantly。 几天前,我写了一篇文章来说明golang中channel的使用规...

    李海彬
  • 如何优雅的关闭Go Channel【译】

    不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作。

    老钱
  • Golang 需要避免踩的 50 个坑(三)

    Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷。如果你刚从其他语言转到 Go,那这篇文章里的坑...

    aoho求索
  • Wireshark的HTTP请求包和响应包如何对应

    以Wireshark2.6.3版本为例,如下图所示,红框中的803是一次HTTP的GET请求包,绿框中的809、810两条记录都是响应包,究竟哪个是803的响应...

    程序员欣宸
  • 如何优雅关闭 Spring Boot 应用

    随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止...

    闻人的技术博客
  • 使用Go语言创建WebSocket服务

    今天介绍如何用Go语言创建WebSocket服务,文章的前两部分简要介绍了WebSocket协议以及用Go标准库如何创建WebSocket服务。第三部分实践环节...

    KevinYan
  • 如何优雅记录 http 请求/ 响应数据?

    作者:fredalxin 地址:https://fredal.xin/http-body-recorder

    Java技术栈
  • 《Go语言入门经典》19~21章读书笔记

    Go语言在net/http包中提供了一个快捷方法,可用于发出简单的GET请求。使用这个方法意味着不需要考虑如何配置HTTP客户端以及如何设置请求报头。如果只是要...

    跑马溜溜的球
  • 如何远程关闭一个ASP.NET Core应用?

    在《历数依赖注入的N种玩法》演示系统自动注册服务的实例中,我们会发现输出的列表包含两个特殊的服务,它们的对应的服务接口分别是IApplicationLifeti...

    蒋金楠
  • 深入学习用Go编写HTTP服务器

    Go是一门通用的编程语言,想要学习 Go 语言的 Web 开发,就必须知道如何用 Go 启动一个 HTTP 服务器用于接收和响应来自客户端的 HTTP 请求。用...

    KevinYan
  • 如何快速获取抓包文件中HTTP请求的响应时间

    在日常的工作中经常会会遇到一些请求性能问题,原因可发生在请求的每一个环节:客户端,网络,服务端,这里我们通常需要通过抓包来定位问题出在哪个环节。本文简单介绍一个...

    苏东
  • MyEclipse中如何隐藏关闭的项目?

    黑泽君
  • Golang中用到的的Websocket库

    在不刷新页面的情况下发送消息并获得即时响应是我们认为理所当然的事情。但在过去,启用实时功能对开发人员来说是一个真正的挑战。开发者社区已经从 HTTP...

    没有故事的陈师傅
  • go语言最快最好运用最广的web框架比较(大多数人不了解的特性)

    如果你为自己设计一个小应用程序,你可能不需要一个Web框架,但如果你正在进行生产,那么你肯定需要一个,一个好的应用程序。

    李海彬
  • 学会使用context取消goroutine执行的方法

    Go语言里每一个并发的执行单元叫做goroutine,当一个用Go语言编写的程序启动时,其main函数在一个单独的goroutine中运行。main函数返回时,...

    KevinYan

扫码关注云+社区

领取腾讯云代金券