第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何通過管道將 curl 導(dǎo)入 Go 程序?

如何通過管道將 curl 導(dǎo)入 Go 程序?

Go
桃花長相依 2023-05-04 17:41:00
我想寫一個小的 Go 程序,我可以用它來美化 json 數(shù)據(jù)。當(dāng)我使用文件時它已經(jīng)工作了。這是代碼: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 運(yùn)行此代碼:curl -s "https://min-api.cryptocompare.com/data/top/exchanges?fsym=BTC&tsym=USD" | prettyjson我得到:(23) Failed writing body我在這篇文章中看到在curl 可以寫入所有數(shù)據(jù)之前管道正在關(guān)閉,但是我如何優(yōu)化我的 Go 程序以等待 curl 完成?
查看完整描述

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)

? ? ? ? }

? ? }

}


查看完整回答
反對 回復(fù) 2023-05-04
  • 1 回答
  • 0 關(guān)注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號