例如一个很简单的下载github上raw文件的函数,conn总是一次性读取到了响应body的所有数据,无法像nodejs那种接收chunk,计算chunk大小来制作进度条。请问在go中是怎样制作下载进度条?
package util
import (
"io/ioutil"
"net/http"
"net/url"
"path"
)
func Download(URL string)(error) {
resp, err := http.Get(URL)
if err != nil {
return err
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
u, err := url.Parse(URL)
if err != nil {
return err
}
fileName := path.Base(u.Path)
err = ioutil.WriteFile(fileName, data, 0755)
if err != nil {
return err
}
return nil
}
我该从tcp入手么?
有疑问加站长微信联系(非本文作者)

那你就别 ReadAll,直接通过 Read 读取,一次读一定字节的数据。
有一个疑问啊,我拿到 resp 的时候是数据都已经到resp.Body了么?
拿到的body,不代表数据传完了~~~ 你可以一次读一部分,然后根据 resp header 里面的 Content-Length 来做进度条
对的,后来拿很大的文件试了下发现会一直阻塞在ioutil.ReadAll(),然后就拿content-length做了一个
使用 bufio 的reader来读,
类似这样