为什么我从io.PipeReader中获取EOF?

blz*_*blz 0 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)
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ada*_*ith 5

fmt.Fscan有两个论点.读取的读取器,以及要填充的对象的一个​​或多个指针.其结果是(n int, err error),n读取的项目数量在哪里,并且err是为什么n小于您输入其第二个参数的(variadic ...)数据对象切片的原因.

在这种情况下,数据对象的切片长度为零,因此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"}
}
Run Code Online (Sandbox Code Playgroud)