2017-10-13 6 views
0

私はプロジェクトで似たようなものを使用していますが、私はちょっと困惑しています。なぜ何も印刷されていませんか?これはある種の競合状態io.PipeReaderからEOFを取得するのはなぜですか?

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を削除しようとしましたが、何も変わりません。

+0

それはない:それは本当に[MCVE](https://stackoverflow.com/ないようhttps://play.golang.org/p/ec_Dbonaq4が見えますヘルプ/ mcve)を使用してください。 – kostix

+0

@kostix私は不明だったと思う。私はEOF _error_を取得していませんが、何も印刷されていません。この例は* MCVEとしての資格を与えます*。質問が編集されました。 – blz

答えて

5

fmt.Fscanには2つの引数があります。読み込む読者、読み込むオブジェクトへのポインタ。その結果はであり、nは読み取られたアイテムの数であり、errは、nが2番目の引数に入力したデータオブジェクトの(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"} 
} 
関連する問題