gpt4 book ai didi

GoLang 链接 io.Reader

转载 作者:数据小太阳 更新时间:2023-10-29 03:45:24 25 4
gpt4 key购买 nike

我正在尝试实现一个代理模式来对 io.Reader 进行链式转换,以便有效地处理字节 block 。

  1. 我们不能在接收器上使用指针,所以我的解决方案似乎不是很有效

  2. 下面的代码说“process take too long”

完整示例位于:https://play.golang.org/p/KhM0VXLq4CO

b := bytes.NewBufferString(text)
t := transformReaderHandler(*b)
readByChunk(t)

type transformReaderHandler bytes.Buffer

func (t transformReaderHandler) Read(p []byte) (n int, err error) {
n, err = (*bytes.Buffer)(&t).Read(p)
//if n > 0 {
// Do Something on the chunk
//}
return
}

您是否有更高效(内存效率、计算效率)的解决方案?

为什么这段代码不起作用?

编辑:@svsd 解决方案的实现:https://play.golang.org/p/VUpJcyKLB6D

package main

import (
"io"
"fmt"
"bytes"
)

const text = "Reaaaaally long and complex text to read in chunk"

func main() {
b := bytes.NewBufferString(text)

t := (*transformReaderHandler)(b)

readByChunk(t)
}

type transformReaderHandler bytes.Buffer

func (t *transformReaderHandler) Read(p []byte) (n int, err error) {
n, err = (*bytes.Buffer)(t).Read(p)
if n > 0 {
p[0] = 'X'
}
return
}

func readByChunk(r io.Reader) {
var p = make([]byte, 4)

for {
n, err := r.Read(p)
if err == io.EOF {
break
}
fmt.Println(string(p[:n]))
}
}

最佳答案

每次在 transformReaderHandler 上调用 Read 时,您都在复制 bytes.Buffer 值,因此您永远无法通过缓冲区.您必须使用 *bytes.Buffer 指针来避免此复制。

在您的 transformReaderHandler 中嵌入缓冲区(或者将其添加为命名字段),以便您可以根据需要调用委托(delegate) Read 方法。

type transformReaderHandler struct {
*bytes.Buffer
}

func (t *transformReaderHandler) Read(p []byte) (n int, err error) {
n, err = t.Buffer.Read(p)
//if n > 0 {
// Do Something
//}
return
}

https://play.golang.org/p/npZQ4Tz0hhv

关于GoLang 链接 io.Reader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52205535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com