两种方案对比总结:
reader := bytes.NewReader(claudeReqBody)
优点:
- 代码简单清晰
- 无需维护 Pool
- 适合一般场景
- 没有并发安全问题
缺点:
- 每次都会分配新的 Reader 结构体
- 高并发场景下可能增加 GC 压力
使用场景:
- 一般的 HTTP 请求场景
- 并发量不大的系统
- 追求代码简洁性的场合
reader := conf.ReaderPool.Get().(*bytes.Reader)
优点:
- 重用 Reader 结构体,减少内存分配
- 高并发场景下可减轻 GC 压力
- 无内存拷贝(Reset 只更新指针)
缺点:
- 需要维护 Pool
- 代码较复杂,需要记得 Put 回池
- Pool 操作有少量开销
- 需要考虑并发安全
使用场景:
- 高并发系统
- 频繁创建 Reader 的场景
- 对 GC 敏感的应用
- 经过性能测试证明有明显优势时
选择建议: - 默认使用方案1(NewReader) - 只有在性能测试证明 Reader 创建是瓶颈时才考虑方案2(Pool) - “premature optimization is the root of all evil”(过早优化是万恶之源)