golang中为什么Response.Body需要被关闭详解

  

  

本文主要介绍了关于golang中Response.Body需要被关闭的相关内容,文中通过示例代码介绍的非常详细,对各位学习或者使用golang具有一定参考学习价值,下面话不多说了,来一起看看详细的介绍吧

  
  身体io.ReadCloser

  

http客户端和运输保证身体总是非nil值,甚至>//源码版本1.8.3//src/net/http/transfer。:405身体解析方法   func readTransfer(味精接口{},r * bufio.Reader)(错错误)//src/net/http/transfer。:485解析分块   t。身体=,身体{src: internal.NewChunkedReader (r), hdr:味精、r: r,关闭:t.Close}//src/net/http/transfer。:490产生eof   t。身体=,身体{src: io。realLength LimitReader (r),关闭:t.Close}//src/net/http/transport。:1560发送eof信号   身体:=,bodyEOFSignal {//src/net/http/transport。1583年:gzip解码   分别地。身体=,gzipReader{身体:身体}      

<强>身体实际上是一个嵌套了多层的net.TCPConn:

  
      <李> bufio.Reader,这层尝试将多次小的读操作替换为一次大的读操作,减少系统调用的次数,提高性能,李   <李> io.LimitedReader, tcp连接在读取完身体后不会关闭,继续读会导致阻塞,所以需要LimitedReader在身体读完后发出eof终止读取;李   <李> chunkedReader,解析分块格式编码(如果不是分块略过),李   <李> bodyEOFSignal,在读到eof,或者是提前关闭时身体会对readLoop发出回收连接的通知;李   <李> gzipReader,解析gzip压缩(如果不是gizp压缩略过),李   
  

从上面可以看出如果身体既没有被完全读取,也没有被关闭,那么这次http事务就没有完成,除非连接因超时终止了,否则相关资源无法被回收。

  

如果请求头或响应头指明连接:紧密呢?还是无法回收,因为关闭表示在http事务完成后断开连接,而事务尚未完成自然不会断开,更不会回收。

  

从实现上看只要身体被读完,连接就能被回收,只有需要抛弃身体时才需要近,似乎不关闭也可以。但那些正常情况能读完的身体,即第一种情况,在出现错误时就不会被读完,即转为第二种情况。而分情况处理则增加了维护者的心智负担,所以始终近身体是最佳选择。

  

  

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

golang中为什么Response.Body需要被关闭详解