在 Go 中从连接读取任意字节时保留缓冲区
在必须从连接读取数据流并进一步读取的情况下以块的形式处理时,出现了一个常见的挑战:处理不同的流长度并适应任意字节数。
考虑以下代码片段,其中使用 256 字节缓冲区来读取和处理来自连接的数据:
buf := make([]byte, 256) for { n, err := conn.Read(buf) fmt.Println(string(buf)) if err != nil || n== 0 { return } Handle(buf[:n]) }
虽然这种方法在有足够字节可用时效果很好,但在流结束时会遇到问题,导致可读字节少于 256 个。为了妥善处理这种情况,需要替代解决方案。
一种方法是利用 bytes.Buffer,它提供了一种收集从连接接收的数据的便捷方法。通过利用 bytes.Buffer,可以在单个操作中累积完整的数据流并将其传递到所需的处理程序:
var b bytes.Buffer if _, err := io.Copy(&b, conn); err != nil { return err } Handle(b.Bytes())
通过此实现,Handle 函数将整个数据流作为单个数据流接收字节切片,确保无缝处理,无论其长度如何。
通过采用这种方法,开发人员可以有效地处理任意长度的流,保留所需的缓冲区大小,同时保持从连接接收的数据的完整性。
以上是如何在 Go 中从连接读取任意字节时保留缓冲区大小?的详细内容。更多信息请关注PHP中文网其他相关文章!