Go中多协程分片下载核心是按字节范围切分文件、并发发Range请求、用WriteAt偏移写入,无需额外合并;需验证服务端Accept-Ranges支持、控制并发、错误重试、断点续传与进度跟踪。
在 Go 中实现多协程分片下载并合并文件,核心是将大文件按字节范围切分为多个片段,为每个片段启动独立 goroutine 并发请求(带 Range 头),最后按顺序拼接所有分片写入目标文件。关键在于 HTTP 范围请求支持、并发控制、错误重试、文件偏移写入和线程安全的进度跟踪。
分片下载的前提是目标服务器支持 HTTP Range 请求(返回状态码 206 Partial Content 且响应头含 Accept-Ranges: bytes)。可先发起一次 HEAD 请求验证:
http.Head(url) 获取响应头resp.Header.Get("Accept-Ranges") == "bytes"
Content-Length 得到总大小,用于计算分片边界将文件按固定块大小(如 1MB)或指定协程数(如 4–8)切分。每个 goroutine 创建独立的 *http.Client(避免共享连接池干扰),设置超时,并在请求头中添加 Range: bytes=start-end:
os.OpenFile(..., os.O_CREATE|os.O_WRONLY, 0644) 创建目标文件(不截断)file.WriteAt(data, int64(start)) 写入对应偏移,避免竞态sync.WaitGroup 等待全部完成,用 errgroup.Group 统一捕获首个错误不需要额外“合并”步骤——因为每个分片都精确写入目标文件的指定字节位置,所有 goroutine 完成后,文件即为完整有序内容。注意:
end = total-1
WriteAt 是线程安全的(底层调用系统 pwrite)生产环境建议补充:
context.WithTime
out 防卡死atomic.Int64 统计已下载字节数,供进度条使用pwrite 支持让其实现比传统多进程更轻量、更可控。