为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Go 以非阻塞方式从控制台读取输入?

如何使用 Go 以非阻塞方式从控制台读取输入?

Go
烙印99 2021-09-09 13:58:58
所以我有:import (    "bufio"    "os")//...var reader = bufio.NewReader(os.Stdin)str, err := reader.ReadString('\n')但是reader.ReadString('\n')正在阻止执行。我想以非阻塞方式读取输入。是否可以通过os.Stdin使用bufioGo 中的包或任何其他 std lib 包来实现非阻塞缓冲输入?
查看完整描述

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

一般来说,Go 中没有非阻塞 IO API 的概念。你可以通过使用 goroutines 来完成同样的事情。


这是一个关于Play的例子, stdin 是模拟的,因为 play 不允许它。


package main


import "fmt"

import "time"


func main() {

    ch := make(chan string)

    go func(ch chan string) {

        /* Uncomment this block to actually read from stdin

        reader := bufio.NewReader(os.Stdin)

        for {

            s, err := reader.ReadString('\n')

            if err != nil { // Maybe log non io.EOF errors, if you want

                close(ch)

                return

            }

            ch <- s

        }

        */

        // Simulating stdin

        ch <- "A line of text"

        close(ch)

    }(ch)


stdinloop:

    for {

        select {

        case stdin, ok := <-ch:

            if !ok {

                break stdinloop

            } else {

                fmt.Println("Read input from stdin:", stdin)

            }

        case <-time.After(1 * time.Second):

            // Do something when there is nothing read from stdin

        }

    }

    fmt.Println("Done, stdin must be closed")

}



查看完整回答
反对 回复 2021-09-09
  • 1 回答
  • 0 关注
  • 266 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信