一道看似基础、却很容易暴露工程习惯的 Go 面试题是:调用 http.Get 或 client.Do 拿到响应后,为什么总要写 defer resp.Body.Close()?
有人会回答“防止内存泄漏”,也有人会回答“为了复用连接”。方向并非完全错误,但还不够准确:响应体本质上连接着网络数据流,关闭是调用方的责任;对于默认客户端使用的 HTTP/1.x 持久连接,想让连接更可能被下一次请求复用,通常还要把响应体读取到结束再关闭。
这个小细节会直接影响接口调用、爬虫采集和批处理任务的稳定性。