首页 >后端开发 >Golang >如何在 Go 中检测 STDIN 上的可读内容而不阻塞?

如何在 Go 中检测 STDIN 上的可读内容而不阻塞?

Patricia Arquette
Patricia Arquette原创
2024-12-15 21:00:18282浏览

How Can I Detect Readable Content on STDIN in Go Without Blocking?

在 Go 中检测 STDIN 上的可读内容

假设您希望命令行工具根据 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn