如何在提示输入带有文本"Enter input"的内容之前检查 os.stdin 是否可用



我必须从os.stdin获取一些输入。在打印诸如"输入您的文本"之类的语句然后从输入中读取之前,我如何检查它是否可用于阅读。如果 stdin 不可用,则在"输入您的文本"之后打印错误的文件描述符。如何避免这种情况?

package main
import (
"bufio"
"os"
"io"
"fmt"
)
func main(){
consSource := NewConsoleAccessTokenSource("www.google.co.in", os.Stdin)
fmt.Print("Token: ")
consSource.scanner.Scan()
err := consSource.scanner.Err()
if err != nil {
fmt.Print(err)
}
fmt.Print(consSource.scanner.Text())
}
func NewConsoleAccessTokenSource(websiteUrl string, reader io.Reader) *ConsoleAccessTokenSource {
s := &ConsoleAccessTokenSource{}
s.WebsiteUrl = websiteUrl
s.scanner = bufio.NewScanner(reader)
return s
}
type ConsoleAccessTokenSource struct {
WebsiteUrl string
scanner *bufio.Scanner
}

这就是我正在尝试做的事情,当我使用"nohup 可执行文件"运行此程序时 它给出了错误的文件描述符。

os.Stdinos包的导出变量,它的类型为*os.File

您可以调用File.Stat()以查看它是否可用,并获取有关它的其他信息(例如,它是否正在管道传输或其源是终端(:

if _, err := os.Stdin.Stat(); err != nil {
fmt.Println("Stdin not available:", err)
} else {
fmt.Println("Stdin available.")
}

让我们看一个不可用时的示例。如果我们先关闭它,例如使用File.Close()方法,则不会:

fmt.Println("Closing:", os.Stdin.Close())
if _, err := os.Stdin.Stat(); err != nil {
fmt.Println("Stdin not available:", err)
} else {
fmt.Println("Stdin available.")
}

输出(在Go Playground上尝试(:

Stdin available.
Closing: <nil>
Stdin not available: stat /dev/stdin: Bad file number

另请查看相关问题:检查 Golang 中的 STDIN 是否有要阅读的内容

最新更新