1 回答

TA貢獻1824條經驗 獲得超8個贊
關于 OP 源代碼,我會考慮更改條件以檢測管道的存在。
正確的條件不需要檢查輸入的長度??紤]一下,這完全是有道理的,因為您可以在不寫入數據的情況下打開標準輸入。
除了所提出的解決方案對于它試圖實現的目標而言似乎毫無用處的復雜性,json 輸入的漂亮打印。
我發現使用標準庫足以實現給定測試用例的目標。
關于這個問題...but how do I optimize my Go program to wait until curl is done?
,OP 似乎不了解文件描述符的工作方式。事實上,這個問題甚至都不正確,因為該進程理論上可以保持活動狀態但主動決定關閉 Stdin。OP 對進程的活躍度不感興趣,相反,他應該在讀取 Stdin 時簡單地尋找 EOF 信號,表明感興趣的數據已正確發送。
無論如何,一個簡單的解決方案看起來像這樣,用 json 解碼器包裝 stdin,循環直到 eof 或發生錯誤,對于每個解碼數據,用 stdout 的包裝器將其編碼為 json,再次出現錯誤中斷。
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 關注
- 146 瀏覽
添加回答
舉報