在 Golang 中检查 STDIN 上的可用输入
在某些命令行场景中,了解 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") } }
虽然此代码适用于管道输入,但当不存在输入时,它会在 ioutil.ReadAll(os.Stdin) 处停止。本文解决了这个问题,提供了一个解决方案来确定 stdin 数据的可用性。
解决方案:检查文件模式
解决方案在于检查标准输入流。当stdin是常规文件(例如终端)时,其模式包括os.ModeCharDevice,指示字符设备状态。相反,如果输入是通过管道传输的,则该模式缺少此标志。以下代码演示了这种方法:
package main import ( "fmt" "os" ) func main() { 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") } }
通过此修改,您的程序可以区分管道和基于终端的 stdin 输入,从而允许进行适当的行为调整。
以上是如何在 Golang 中检查 STDIN 上的可用输入?的详细内容。更多信息请关注PHP中文网其他相关文章!