開發命令列實用程式時,通常需要區分從另一個程式透過管道傳輸的輸入或互動式輸入的輸入。本文介紹如何檢查 Go 中的 STDIN 上是否存在資料。
考慮以下程式碼:
package main import ( "fmt" "io/ioutil" "os" ) func main() { bytes, _ := ioutil.ReadAll(os.Stdin) if len(bytes) > 0 { fmt.Println("Something on STDIN: " + string(bytes)) } else { fmt.Println("Nothing on STDIN") } }
使用管道輸入呼叫時(例如, echo foo | go run test.go),此程式碼正確辨識輸入。但是,如果以互動方式呼叫(沒有管道輸入),程式將無限期地等待 ioutil.ReadAll(os.Stdin)。
要區分管道輸入和非管道輸入,請使用 os .ModeCharDevice。此模式識別輸入是否來自終端。如果不是來自終端,則很可能是透過管道傳輸的。
stat, _ := os.Stdin.Stat() if (stat.Mode() & os.ModeCharDevice) == 0 { fmt.Println("data is being piped to stdin") } else { fmt.Println("stdin is from a terminal") }
以上是在 Go 中如何偵測輸入是否透過管道傳送到 STDIN?的詳細內容。更多資訊請關注PHP中文網其他相關文章!