会。http.Get 默认将整个响应体读入内存,大文件易导致OOM;正确做法是流式下载到磁盘,配合Range请求实现断点续传,并用io.Copy安全分块写入。
用 http.Get 直接读大文件会 OOM 吗?
会。默认 http.Get 把整个响应体读进内存(resp.Body.Read 不调用的话,底层连接可能卡住;一调用 io.ReadAll 就崩)。1GB 文件触发 GC 压力,还可能直接被系统 kill。
正确做法是边下载边写入磁盘,不缓存全文:
- 用
os.OpenFile以os.O_CREATE | os.O_WRONLY | os.O_APPEND模式打开文件(断点续传时关键) - 用
io.CopyN或分块io.Copy(比如每次make([]byte, 32*1024))流式写入 - 务必检查
resp.StatusCode,不是200或206就别往下写了
怎么发 Range 请求实现断点续传?
核心是设置请求头 Range: bytes=1024-,告诉服务端只返回从第 1024 字节开始的剩余内容。服务端必须支持 Accept-Ranges: bytes,否则返回 200 而非 206,续传就错。
实操要点: