http.Get仅适用于无超时、无头、无错误区分的玩具场景生产环境必须用http.NewRequest自定义http.Client因其可设超时、Header、细粒度错误处理并避免连接泄漏。Go 发 GET 请求最简单的方式是 http.Get但它只适合“不设头、不超时、不重试、不关心错误细节”的玩具场景真实项目里必须用 http.NewRequest http.Client.Do。为什么 http.Get 容易出问题它看似一行搞定但隐藏三个硬伤http.Get 内部用的是默认 http.DefaultClient没有超时控制——请求卡住会永久阻塞 goroutine无法设置 User-Agent、Authorization 等必要 header很多 API 直接返回 403错误处理模糊网络失败、DNS 解析失败、TLS 握手失败全被包装成同一个 error没法区分重试还是放弃怎么写一个生产可用的 GET 请求核心是自己构造 *http.Request 并用带配置的 *http.Client 发起client : http.Client{ Timeout: 10 * time.Second, Transport: http.Transport{ MaxIdleConns: 100, MaxIdleConnsPerHost: 100, },}req, _ : http.NewRequest(GET, https://api.example.com/data, nil)req.Header.Set(User-Agent, MyApp/1.0)req.Header.Set(Accept, application/json)presp, err : client.Do(req)if err ! nil {// 区分是网络错误还是超时if netErr, ok : err.(net.Error); ok netErr.Timeout() {log.Println(request timeout)}return}defer resp.Body.Close() // 必须加否则连接泄漏/ppif resp.StatusCode ! http.StatusOK {log.Printf(unexpected status: %d, resp.StatusCode)return}/ppbody, _ : io.ReadAll(resp.Body)// 后续解析 JSON 或其他格式.../p常见错误现象和修复点这些不是“写错了”而是 Go HTTP 客户端的惯性坑 有道翻译AI助手 有道翻译提供即时免费的中文、英语、日语、韩语、法语、德语、俄语、西班牙语、葡萄牙语、越南语、印尼语、意大利语、荷兰语、泰语全文翻译、网页翻译、文档翻译、PDF翻