1 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個贊
關(guān)于 OP 源代碼,我會考慮更改條件以檢測管道的存在。
正確的條件不需要檢查輸入的長度??紤]一下,這完全是有道理的,因?yàn)槟梢栽诓粚懭霐?shù)據(jù)的情況下打開標(biāo)準(zhǔn)輸入。
除了所提出的解決方案對于它試圖實(shí)現(xiàn)的目標(biāo)而言似乎毫無用處的復(fù)雜性,json 輸入的漂亮打印。
我發(fā)現(xiàn)使用標(biāo)準(zhǔn)庫足以實(shí)現(xiàn)給定測試用例的目標(biāo)。
關(guān)于這個問題...but how do I optimize my Go program to wait until curl is done?
,OP 似乎不了解文件描述符的工作方式。事實(shí)上,這個問題甚至都不正確,因?yàn)樵撨M(jìn)程理論上可以保持活動狀態(tài)但主動決定關(guān)閉 Stdin。OP 對進(jìn)程的活躍度不感興趣,相反,他應(yīng)該在讀取 Stdin 時簡單地尋找 EOF 信號,表明感興趣的數(shù)據(jù)已正確發(fā)送。
無論如何,一個簡單的解決方案看起來像這樣,用 json 解碼器包裝 stdin,循環(huán)直到 eof 或發(fā)生錯誤,對于每個解碼數(shù)據(jù),用 stdout 的包裝器將其編碼為 json,再次出現(xiàn)錯誤中斷。
package main
import (
? ? "encoding/json"
? ? "fmt"
? ? "io"
? ? "log"
? ? "os"
)
func main() {
? ? info, err := os.Stdin.Stat()
? ? if err != nil {
? ? ? ? log.Fatal(err)
? ? }
? ? if info.Mode()&os.ModeCharDevice != 0 {
? ? ? ? fmt.Println("The command is intended to work with pipes.")
? ? ? ? fmt.Println("cat file.json | prettyjson")
? ? ? ? return
? ? }
? ? dec := json.NewDecoder(os.Stdin)
? ? enc := json.NewEncoder(os.Stdout)
? ? enc.SetIndent("", "? ")
? ? for {
? ? ? ? data := map[string]interface{}{}
? ? ? ? if err := dec.Decode(&data); err != nil {
? ? ? ? ? ? if err == io.EOF {
? ? ? ? ? ? ? ? break
? ? ? ? ? ? }
? ? ? ? ? ? log.Fatalf("decode error %v", err)
? ? ? ? }
? ? ? ? if err := enc.Encode(data); err != nil {
? ? ? ? ? ? log.Fatalf("encod error %v", err)
? ? ? ? }
? ? }
}
- 1 回答
- 0 關(guān)注
- 161 瀏覽
添加回答
舉報