我在项目中使用了类似的东西,我有点困惑:为什么没有任何东西被打印出来?
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但它没有任何改变.
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)