我必须从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 executable”运行这个程序时 它给出了错误的文件描述符。
答案 0 :(得分:3)
os.Stdin
是os
包的导出变量,类型为*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
同时检查相关问题:Check if there is something to read on STDIN in Golang