假设您希望命令行工具根据 STDIN 上是否存在输入来表现不同的行为。但是,直接使用 ioutil.ReadAll(os.Stdin) 可能会导致意外行为。
特别是,如果在没有任何 STDIN 输入的情况下调用该工具,程序将无限期地等待输入,从而阻止其继续进行
要解决这个问题,您可以使用 os.Stdin.Stat() 来检查 STDIN文件描述符是一个字符设备。以下代码片段演示了如何实现此目的:
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 文件的 ModeCharDevice 标志被清除时,表示数据正在通过管道传送到 STDIN。否则,表明 STDIN 已连接到终端。通过检查此标志,您可以确定 STDIN 上是否有内容需要读取,而不会阻塞程序。
以上是如何在 Go 中检测 STDIN 上的可读内容而不阻塞?的详细内容。更多信息请关注PHP中文网其他相关文章!