我在项目中使用了类似的东西,我有点困惑:为什么没有打印任何东西?
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
是读取的项目数,err
是n
小于您输入到其第二个参数中的数据对象切片(可变...)的原因。
在这种情况下,数据对象的切片长度为零,因此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"}
}