尝试读入缓冲区,然后使用缓冲区支持两个新的读取器,一个供您使用,另一个供以后的使用者使用。例如,假设我们要修改以下代码:
doStuff(r.Body) // r is an http.Request
我们可以做:
buf, _ := ioutil.ReadAll(r.Body)rdr1 := ioutil.NopCloser(bytes.NewBuffer(buf))rdr2 := ioutil.NopCloser(bytes.NewBuffer(buf))doStuff(rdr1)r.Body = rdr2 // OK since rdr2 implements the io.ReadCloser interface// Now the program can continue oblivious to the fact that// r.Body was ever touched.
请注意,
*bytes.Buffer它没有
Close()error方法,因此没有实现
io.ReadCloser接口。因此,我们必须将
*bytes.Buffer值包装在对的调用中
ioutil.NopCloser。



