栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如果在调用http.Get(url)时发生错误,我们是否需要关闭响应对象?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如果在调用http.Get(url)时发生错误,我们是否需要关闭响应对象?

一般概念是,当一个函数(或方法)具有多个返回值(一个为an)时

error
,应首先检查错误,并且只有在错误为时才进行检查
nil
。如果存在,则函数应为其他(非错误)值返回零值
error
。如果函数的行为不同,则应记录在案。
http.Get()
没有记录这种偏差。

所以应该这样处理:

res, err := http.Get(url)if err != nil {    log.Printf("Error: %sn", err)    return}defer res.Body.Close()// Read/work with body

笔记:

正如JimB所确认的那样

nil
,即使返回了非错误,即使响应为非
nil
,我们也不必关闭它。在重定向错误的情况下,非
nil
响应可以保存上下文以及关于重定向失败的位置的进一步信息。请参阅以下详细信息:

http.Get()
遵循“大部分时间”的一般概念:
nil
如果出现错误,它将返回响应:

return nil, someError

但是检查

client.go
,未导出的方法
Client.doFollowingRedirects()
,当前行#427:

if redirectFailed {    // Special case for Go 1 compatibility: return both the response    // and an error if the CheckRedirect function failed.    // See https://golang.org/issue/3795    return resp, urlErr}

因此,由于向后兼容性问题,如果重定向失败,它可能会同时返回无

nil
响应和
nil
无错误。

另一方面,尝试调用

resp.Body.Close()
if
resp
is
nil
将导致运行时恐慌。

因此,如果我们想在这种情况下关闭响应主体,它可能看起来像这样(如果

resp
不是,则只能关闭
nil
):

res, err := http.Get(url)if err != nil {    log.Printf("Error: %sn", err)}if res != nil {    defer res.Body.Close()    // Read/work with body}

要么:

res, err := http.Get(url)if err != nil {    log.Printf("Error: %sn", err)}if res == nil {    return}defer res.Body.Close()// Read/work with body

http.Response
保证文档即使没有响应数据
Response.Body
也不会
nil
存在:

// The http Client and Transport guarantee that Body is always// non-nil, even on responses without a body or responses with// a zero-length body.

但是, 如果错误不是

nil
,则不必关闭无
nil
响应主体。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/399552.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号