IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> golang http 包 Response.Body.Close -> 正文阅读

[网络协议]golang http 包 Response.Body.Close

今天简单说下 Response.Body.Close,当发起一个请求后,需要手动关闭此请求。

但,这个关闭的位置也有考究。

一开始,项目中的代码是如下顺序写的。

res, err := cli.Do(req)
defer res.Body.Close()
if err != nil {
	fmt.Println(err.Error())
	return
}

正常情况下,是不会遇到有问题的情况。在不定期检测线上的日志的时候,还是会发现,第二行那报空指针错误

invalid memory address or nil pointer dereference, goroutine 43 [running]:

终于在某次线上需求,需要临时调整个路由地址时,发现了原因。一开始不知道路由对应的域名对应的机房是做了环境隔离的,导致连不上,这时发现日志都是空指针错误。然后,在线下复现了下,也就是准备个不存在的地址,并且在第二行那打个断点,发起个请求,便看到

bad access: nil dereference

同时,也发现 err 的值为

context deadline exceeded (Client.Timeout exceeded while awaiting headers)

也就是说,此请求压根就没有发起或是连接失败,那么也就不用关闭了

ok,接下来,就调整了顺序。

res, err := cli.Do(req)
if err != nil {
	fmt.Println(err.Error())
	return
}
defer res.Body.Close()

这时便不会报空指针错误,并且打印了错误原因。

到此为止了么,若是再思考下,为什么调整了顺序,就不报空指针错误呢,一开始,第二行用了 defer 了啊,应该是在程序的最后执行的啊,和调整后的有什么区别么?

这个得从 defer 执行机制说起,在程序执行到 return 后,defer 是逆序执行,典型的先进后出执行。

没调整顺序时,是先打印空指针错误,然后到 return,然后开始执行 defer 里的代码,由于请求没有发起成功,因此 res 为 nil,关闭时便会报空指针错误。

调整顺序后,是先打印空指针错误,然后到 return。注意,defer 是放到 return 之后,也就是此时是没有 defer 的执行语句的,也就不用执行了,也就不会报错了。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-01-01 14:20:18  更:2022-01-01 14:21:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/6 13:26:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码