go - 从 Reader 读取并写入 Golang 中的 Writer 时是否需要检查非零长度?

标签 go

当我尝试手动从 Reader 复制到 Writer 时,我注意到这是可行的:

func fromAToB(a, b net.Conn) {
    buf := make([]byte, 1024*32)
    for {
        n, err := a.Read(buf)
        if n > 0 {
            if err != nil {
                log.Fatal(err)
            }
            b.Write(buf[0:n])
        }
    }
} 

但这不是

func fromAToB(a, b net.Conn) {
    buf := make([]byte, 1024*32)
    for {
        _, err := a.Read(buf)
        if err != nil {
            log.Fatal(err)
        }
        b.Write(buf)
    }
}

所以问题是:

  • 为什么检查 if n>0 是必要的?
  • 这是否只对 net.Conn 或任何实现 Reader 和 Writer 接口(interface)的类型是必需的?

编辑:第二个片段运行良好,没有任何运行时错误,只是行为不正确。我想知道 n>0 检查的效果是什么,以及当我删除它时表面下会发生什么。

最佳答案

已经有一个函数io.Copy做到这一点。你可以see how it's implemented一个很好的例子。它适用于所有 io.Reader/io.Writer 类型。

关于go - 从 Reader 读取并写入 Golang 中的 Writer 时是否需要检查非零长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44974343/

相关文章:

postgresql - 数据库/sql 中使用 sql.ErrNoRows 的示例崩溃并烧毁

go - 如何使 Go 将枚举字段打印为字符串?

go - 如何获取/打印数组指针 slice 的内容?

go - 如何在服务器端读取grpc中的元数据? (golang 示例)

go - 为 MIPS 构建一个没有硬件浮点的小型 Go 程序(需要 softfloat)

go - 通过 Jenkins 工具安装 go-1.17 时输入格式错误或输入包含不可映射的字符

go - 将自动证书续订证书还是您应该自己做

go - 如何避免来自golang的 "passphrase is too short"

go - 如何使用gin管理Golang中的certfile更新?

python - 相当于 Go 中的 setdefault 吗?