亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過管道將 curl 導入 Go 程序?

如何通過管道將 curl 導入 Go 程序?

Go
桃花長相依 2023-05-04 17:41:00
我想寫一個小的 Go 程序,我可以用它來美化 json 數據。當我使用文件時它已經工作了。這是代碼:package mainimport (    "bufio"    "fmt"    "github.com/Jeffail/gabs"    "log"    "os")func main() {    info, err := os.Stdin.Stat()    if err != nil {        log.Fatal(err)    }    if info.Mode()&os.ModeCharDevice != 0 || info.Size() <= 0 {        fmt.Println("The command is intended to work with pipes.")        fmt.Println("cat file.json | prettyjson")        return    }    reader := bufio.NewReader(os.Stdin)    input, err := reader.ReadBytes('\n')    if err != nil {        log.Fatal()    }    jsonParsed, err := gabs.ParseJSON(input)    if err != nil {        log.Fatal("couldn't parse json")    }    fmt.Println(fmt.Println(jsonParsed.StringIndent("", "  ")))}如果我像這樣使用 curl 運行此代碼:curl -s "https://min-api.cryptocompare.com/data/top/exchanges?fsym=BTC&tsym=USD" | prettyjson我得到:(23) Failed writing body我在這篇文章中看到在curl 可以寫入所有數據之前管道正在關閉,但是我如何優化我的 Go 程序以等待 curl 完成?
查看完整描述

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)

? ? ? ? }

? ? }

}


查看完整回答
反對 回復 2023-05-04
  • 1 回答
  • 0 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號