如何检查os.stdin是否可用,然后提示输入带有文本“输入输入”的内容

时间:2017-07-19 07:07:56

标签: go

我必须从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”运行这个程序时 它给出了错误的文件描述符。

1 个答案:

答案 0 :(得分:3)

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

同时检查相关问题:Check if there is something to read on STDIN in Golang