2017-10-13 74 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

它並不:https://play.golang.org/p/ec_Dbonaq4看起來這是不是一個真正的[MCVE(https://stackoverflow.com/幫助/麥克風)爲您的真正問題。 – kostix

+0

@kostix我想我不清楚。我沒有收到EOF _error_,但沒有任何內容正在打印。示例*不符合MCVE的要求。編輯的問題。 – blz

回答

5

fmt.Fscan需要兩個參數。要讀取的讀者,以及一個或多個指向要填充的對象的指針。其結果是(n int, err error),其中n是讀取的項目數,而errn小於您輸入第二個參數的(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"} 
} 
相關問題