response, err := client.Do(reqest)
defer response.Body.Close()
当我client.Do(reqest) 完了以后,所有数据是已经在内存里面了吗?
ioutil.ReadAll(response.Body) 还是这个才是从服务网GET数据下来?
如果我想控制下载的速度,是不是就是在read这一步 限制下读取速度?(前提是read的时候,是从服务器上拉数据...,代码在下面..)
buf := make([]byte, 1024)
for {
n, err := r.Body.Read(buf)
if err != nil {
break
}
}
有疑问加站长微信联系(非本文作者)

嗯,是这样的。网络 IO,读的时候才会获取数据。
相关跟代码:transfer.go?s=7038:7050#L290
HTTP 请求一旦发出,服务端不管你读不读,都会响应数据,也就是数据会传输过来,不过,这时候数据是在操作系统实现的协议栈的buffer中,也就是操作系统保存了。
从 resp.Body 中读,只是从协议数据中把数据读到当前程序中。不会影响网路数据的传输。
补充一下,你可以通过 Wireshark 之类的抓包工具来试试着两种情况。
那么buffer满了是不是就不读了?等待取走才会接着从io读取?
如果 buffer 满了,客户端会通过 winsize=0 告知服务端 buffer 满了,这时服务端不会再发送数据,而是会检测客户端啥时候buffer酉空间了(或客户端酉空间了告知服务端)。因此,从这个意义上来说,可以通过控制读取速度来控制从服务器拉数据的速度。
Linux TCP socket buffer 相关的知识:
推荐看看 火丁笔记的 《关于FIN_WAIT1》 这篇文章