猿问

golang中的文件输入

我是 Go 的新手(就像在最后一天一样)并且正在玩一个处理来自 stdin 的数据的简单程序。我想要做的是,如果没有向标准输入提供数据,那么程序将输出一个帮助屏幕,然后退出。我遇到的问题是,当没有通过标准输入提供数据时,程序似乎无限期挂起。这是该程序和我的预期用途的简短示例:


package main


import (

    "fmt"

    "bufio"

    "os"

)



func main() {

    scanner := bufio.NewScanner(os.Stdin)

    scanner.Split(bufio.ScanLines)

    for scanner.Scan() {

        str := scanner.Text()

        fmt.Println(str)

    }

}



Running with input:

go run test.go < lines.txt

line1

line2

line3



Running with no input:

go run test.go

我不提供输入的第二种情况是导致程序挂起的原因。通读文档,我不清楚如何编写程序以不无限期地等待输入,而是在 stdin 上不存在任何内容时中断。


翻翻过去那场雪
浏览 312回答 2
2回答

慕姐4208626

该程序的行为与代码所说的完全一样。代码说从标准输入读取。可以通过重定向提供 stdin 的输入(如您所示)。或者通过管道。或者.... 或者通过用户在键盘上打字。如果在最后一种情况下程序会在人类进入某些东西之前退出,那将是非常令人惊讶的。一种常见的方法是执行类似(简化)的操作:var in *os.Filevar err errorswitch name := flag.Arg(0); {case name == "":&nbsp; &nbsp; &nbsp; &nbsp; in = os.Stdindefault:&nbsp; &nbsp; &nbsp; &nbsp; if in, err = os.Open(name); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; &nbsp; &nbsp; }}IE。允许处理作为命令行参数给出的命名文件 - 但当没有文件名参数提供给程序时,回退/默认读取标准输入。这种方法可以很好地与 shell 脚本、通过管道链接命令等配合使用。
随时随地看视频慕课网APP

相关分类

Go
我要回答