从头再读取 io.Reader: 覆水难收?
原文中文,约2700字,阅读约需7分钟。发表于: 。前几天,我们百度的同学分享了Go标准库中一段好玩的好玩的代码, net/http/response.go中一段检查HTTP的headser中Content-Length未设置的情况下,对http.Body的有趣的处理。
本文介绍了Go语言中处理从Reader读取一部分字节后,再让调用者从头开始读取的方法,以及soheilhy/cmux如何实现预读取的功能。通过克隆响应对象并读取1个字节来判断Body是否为空,如果不为空则通过io.MultiReader将已读取的1字节内容和原Body组合,形成一个新的io.Reader。类似的逻辑处理也出现在标准库net/http/transfer.go中。