开发命令行实用程序时,通常需要区分从另一个程序通过管道传输的输入或交互式输入的输入。本文介绍如何检查 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中文网其他相关文章!