首页 > 后端开发 > Golang > 在 Go 中如何检测输入是否通过管道传送到 STDIN?

在 Go 中如何检测输入是否通过管道传送到 STDIN?

Patricia Arquette
发布: 2024-12-29 18:27:14
原创
957 人浏览过

How Can I Detect if Input is Piped to STDIN in Go?

在 Golang 中检测 STDIN 上的输入

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板