登录
首页 >  Golang >  Go问答

在 Golang 中连续执行 io.Copy(os.Stdout, &r) 的效果比较

来源:stackoverflow

时间:2024-03-21 12:42:47 425浏览 收藏

在 Go 语言中,连续执行 `io.Copy(os.Stdout, &r)` 会导致第二个副本不输出任何内容。这是因为 `io.Reader` (如 `r`) 在读取后无法重置,且不是幂等的。当第一个副本读取 `io.Reader` 时,它将消耗所有数据,导致第二个副本无法读取任何内容。

问题内容

我正在玩golang。关于 io.copy 我在代码中放入了 2 个连续的 io.copy ,但我希望它输出两次结果(testtesttest)。但第二个为零。谁能帮忙解释一下为什么吗?谢了

package main

import (
    "io"
    "os"
    "strings"
    "fmt"

)

type testReader struct {
    w io.Reader
    str string

}


func (tt *testReader) Read (b []byte) (n int, err error) {


    io.Copy(os.Stdout, tt.w)
     n, err = tt.w.Read(b)
     if tt.w !=nil {
        return 0,io.EOF
      }
    return
}

func main() {
    s := strings.NewReader("testtesttest!!!")
    r := testReader{s,"ttthhh"}
    fmt.Println(&r)
    io.Copy(os.Stdout, &r)
//  s.Seek(0,0)   // solution from Poy's answer
    io.Copy(os.Stdout, &r)

}

解决方案


我将把给定的示例修剪为(因为有一些噪音):

package main

import (
    "io"
    "os"
    "strings"
)

func main() {
    s := strings.NewReader("testtesttest")
    io.Copy(os.Stdout, s) // Will print "testtesttest"
    io.Copy(os.Stdout, s) // Won't print anything
}

第二个副本不会输出任何内容的原因是 io.reader (s) 已被读取。从 io.reader 读取不是幂等的(您不能调用它两次以获得相同的结果)。 它也没有办法“重置”它或任何东西。

正如 @jrlambert 指出的,您有 s.Seek()s.Reset() 可以让您重新开始阅读。

今天关于《在 Golang 中连续执行 io.Copy(os.Stdout, &r) 的效果比较》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>