如何在 Go 中安全并发请求多个 URL(解决 EOF JSON 错误)-Golang

本文详解 Go 程序批量请求 Hacker News API 时出现 `EOF json` 错误的根本原因——HTTP 连接复用与服务端异常关闭的冲突,并提供两种可靠解决方案:手动设置 `Request.Close = true` 或配置 `Transport.DisableKeepAlives`,确保 JSON 解析稳定。

Go 默认使用 HTTP/1.1 的持久连接(Keep-Alive),客户端会复用 TCP 连接以提升性能。然而,Hacker News 的 API 服务器在返回响应后静默关闭连接,却未发送标准的 Connection: close 响应头。这导致 Go 的 http.Client 在后续请求中尝试复用已被对端关闭的连接,读取时触发 EOF,进而使 json.Unmarshal 失败(表现为 invalid character ‘\x00’ looking for beginning of value 或类似 EOF 相关错误)。

✅ 推荐解决方案一:显式关闭单次请求连接

修改 get() 函数,不依赖默认客户端行为,而是构造自定义 *http.Request 并设置 req.Close = true:

func get(url string) ([]byte, error) {
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        return nil, err
    }
    req.Close = true // 强制本次请求后关闭连接

    res, err := http.DefaultClient.Do(req)
    if err != nil {
        return nil, err
    }
    defer res.Body.Close() // 注意:务必关闭响应体

    return io.ReadAll(res.Body) // 替换已弃用的 ioutil.ReadAll
}

? 提示:io/ioutil.ReadAll 自 Go 1.16 起已弃用,请使用 io.ReadAll(需导入 “io” 包)。

✅ 推荐解决方案二:全局禁用 Keep-Alive(适合高频批量请求)

若程序中大量调用外部 API,可创建专用 http.Client,禁用连接复用:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 如何在 Go 中安全并发请求多个 URL(解决 EOF JSON 错误)-Golang
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001056+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001056+
  • 本周更新: 0+
  • 最后更新: 2026-03-16