重用io.Reader并捕获长度

时间:2017-07-13 14:43:11

标签: memory go garbage-collection

我正在使用一个返回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压力但是有更有效的方法吗?

0 个答案:

没有答案
相关问题