讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Golang中实现断点续传_Golang net/http 断点续传方法

夜伟姑娘_4966

夜伟姑娘_4966

发布时间:2026-01-02 17:23:02

|

583人浏览过

|

来源于php中文网

原创

需用http.NewRequest手动设Range头并处理206响应;通过Accept-Ranges或Content-Range判断服务端是否支持;文件写入须Seek定位而非O_APPEND;并发分片下载应独立文件句柄或用WriteAt加锁。

如何在golang中实现断点续传_golang net/http 断点续传方法

如何用 net/http 发起带 Range 头的 GET 请求

Go 标准库本身不自动支持断点续传,但完全可以通过手动设置 Range 请求头 + 处理 206 Partial Content 响应来实现。关键在于:你得自己维护已下载字节数,并在下次请求时填入正确的 Range: bytes=<code>start-。

常见错误是直接复用 http.Get —— 它无法自定义请求头。必须用 http.NewRequest 构造请求,并显式设置 Range:

req, err := http.NewRequest("GET", url, nil)
if err != nil {
    return err
}
req.Header.Set("Range", "bytes=1024-") // 从第1024字节开始下载
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
    return err
}
defer resp.Body.Close()

注意:Range 值末尾不加结束位置(如 bytes=1024-)表示“从该位置到文件末尾”,服务端必须支持这种语法(绝大多数 HTTP 服务器都支持)。

如何判断服务端是否支持断点续传

不能只看状态码是否为 206;更可靠的方式是检查响应头中是否存在 Accept-Ranges: bytes 或 Content-Range 字段。如果服务端返回 200 OK 却没这些头,说明它根本不支持分块传输,强行续传会重复下载整个文件。

立即学习“go语言免费学习笔记(深入)”;

实操建议:

Golang Naming
Golang Naming

Go(Golang)命名规范 — 包括包、构造函数、结构体、接口、常量、枚举、错误、布尔值、接收器、getter/setter、函数等。

下载
  • 首次请求先发一个带 Range: bytes=0-0 的试探请求,看响应是否为 206 且含 Content-Range
  • 若返回 200 或 416 Range Not Satisfiable,基本可判定不支持或文件太小(0-0 超出范围)
  • 某些 CDN 或反向代理会屏蔽 Range 头,此时即使源站支持,你也拿不到 206

如何安全地追加写入已存在的文件

用 os.OpenFile 以 os.O_WRONLY | os.O_CREATE | os.O_APPEND 模式打开文件是错的 —— O_APPEND 会强制写到文件末尾,无法跳转到指定偏移量。断点续传必须用 os.O_WRONLY | os.O_CREATE 打开,再调用 file.Seek 定位。

示例关键步骤:

f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
    return err
}
// 假设已下载 1024 字节,接下来要写入第 1024 字节起的位置
_, err = f.Seek(1024, 0)
if err != nil {
    return err
}
io.Copy(f, resp.Body) // 直接写入,无需手动分块

注意:Seek 后必须检查错误;如果文件原本不存在,Seek 会失败,需先创建空文件或改用 os.Truncate 预分配大小(对大文件更友好)。

并发下载多个分片时要注意什么

可以切分 Range(如 0-1023、1024-2047)并发请求,但必须保证每个分片写入对应磁盘偏移,且避免多个 goroutine 同时写同一文件句柄 —— Go 的 *os.File 不是并发安全的。

推荐做法:

  • 每个分片使用独立的 *os.File(通过 os.OpenFile(..., os.O_WRONLY) 重新打开),并用 Seek 定位后写入
  • 或者统一用一个文件句柄,但用 sync.Mutex 保护 WriteAt(注意:不是 Write),因为 WriteAt 是线程安全的
  • 不要依赖 Content-Length 判断总大小 —— 分片响应里这个值只是当前块长度;应首次用 HEAD 请求获取 Content-Length 头

最易被忽略的一点:HTTP/1.1 连接复用下,多个 Range 请求可能被服务端按顺序响应,但 Go 的 http.Transport 默认限制每 host 最多 2 个并发连接,需显式调大 MaxConnsPerHost 才能真正并发。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

519

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

596

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1116

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

771

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1626

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4574

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

2094

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

3986

2025.06.17

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn