我正在使用一个返回io.ReadCloser
的远程API(因此无法在没有读取的情况下获取长度),并且需要在响应中添加一个包含原始数据长度的标头{ {1}},然后将结果io.Reader
写入io.Reader
。
除了省略错误处理外,以下功能在功能上是正确的。但io.Writer
函数会产生7个分配,而addHeaderBytesBuffer
函数会产生8个:
addHeaderTeeReader
我维持func addHeaderBytesBuffer(in io.Reader) (out io.Reader) {
buf := new(bytes.Buffer)
io.Copy(buf, in)
header := createHeader(buf.Len())
return io.MultiReader(header, buf)
}
func addHeaderTeeReader(in io.Reader) (out io.Reader) {
buf := new(bytes.Buffer)
n, _ := io.Copy(ioutil.Discard, io.TeeReader(in, buf))
return io.MultiReader(createHeader(int(n)), buf)
}
func createHeader(length int) (out io.Reader) {
return strings.NewReader(fmt.Sprintf("HEADER:%d", length))
}
个sync.Pool
个实例可以重复使用以降低GC压力但是有更有效的方法吗?