【问题标题】:Golang os.stdin as a Reader in GoroutinesGolang os.stdin 作为 Goroutines 中的阅读器
【发布时间】:2016-02-19 08:58:08
【问题描述】:

可以在 Goroutine 中使用 os.stdin 作为 Reader 吗?基本上我想要完成的是让用户在不阻塞主线程的情况下输入消息。

例子:

go func() {
    for {
        consolereader := bufio.NewReader(os.Stdin)

        input, err := consolereader.ReadString('\n') // this will prompt the user for input

        if err != nil {
             fmt.Println(err)
             os.Exit(1)
        }

        fmt.Println(input)
    }
}()

【问题讨论】:

    标签: go buffer stdin goroutine reader


    【解决方案1】:

    是的,这很好。只要这是唯一与 os.Stdin 交互的 goroutine,一切都会正常工作。

    顺便说一句,您可能想使用bufio.Scanner - 它比bufio.Reader 更好用:

    go func() {
        consolescanner := bufio.NewScanner(os.Stdin)
    
        // by default, bufio.Scanner scans newline-separated lines
        for consolescanner.Scan() {
            input := consolescanner.Text()
            fmt.Println(input)
        }
    
        // check once at the end to see if any errors
        // were encountered (the Scan() method will
        // return false as soon as an error is encountered) 
        if err := consolescanner.Err(); err != nil {
             fmt.Println(err)
             os.Exit(1)
        }
    }()
    

    【讨论】:

    • 感谢您快速详细的回复/示例 :) 我是 Go 新手,我仍在尝试。我今晚试试 bufio.Scanner。再次感谢您的反馈!
    • 我使用您的代码从命令行中的用户输入中提取一个整数,但input.Text() 返回一个字符串。我认为它会返回一个int,因为在命令行中输入了一个数字?我将包含我的代码:input := bufio.NewScanner(os.Stdin) var t TimeOfDay for input.Scan() { number :=input.Text() t = append(t, timeFeatures[number - 1]) }
    • 您必须记住,变量的类型是在编译时决定的,早在您实际向正在运行的程序提供输入之前。编译器无法知道您将来会提供一个数字,因此它别无选择,只能为所有输入选择一种类型 - 在这种情况下,string 是唯一正确的类型所有输入。如果您碰巧知道您需要一个整数,则可以使用 strconv.Atoi 之类的方式对字符串执行显式转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多