为什么我要从我的io中得到EOF.管道阅读器

  • 本文关键字:EOF 管道 io 我要 go
  • 更新时间 :
  • 英文 :


我在项目中使用了类似的东西,我有点困惑:为什么没有打印任何东西?

package main
import (
    "fmt"
    "encoding/json"
    "io"
)
func main() {
    m := make(map[string]string)
    m["foo"] = "bar"
    pr, pw := io.Pipe()
    go func() { pw.CloseWithError(json.NewEncoder(pw).Encode(&m)) }()
    fmt.Fscan(pr)
}

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

这是某种竞争条件吗? 我尝试删除pw.CloseWithError但它没有任何改变。

fmt.Fscan接受两个参数。要从中读取的读取器,以及指向要填充的对象的一个或多个指针。它的结果是 (n int, err error) ,其中n是读取的项目数,errn小于您输入到其第二个参数中的数据对象切片(可变...)的原因。

在这种情况下,数据对象的切片长度为零,因此Fscan填充零个对象,不读取任何数据。它尽职尽责地报告它扫描了0对象,并且由于该数字不少于您传入的对象数量,因此它会报告nil错误。

请尝试以下操作:

func main() {
    m := make(map[string]string)
    m["foo"] = "bar"
    pr, pw := io.Pipe()
    go func() { pw.CloseWithError(json.NewEncoder(pw).Encode(&m)) }()
    var s string
    n, err := fmt.Fscan(pr, &s)
    fmt.Println(n, err)  // should be 1 <nil>
    fmt.Println(s)       // should be {"foo":"bar"}
}

最新更新