小编典典

将stdin击键发送到通道而无需换行

go

在每个单独的击键输入到stdin之后,我想直接将用户的击键发送到通道。

我尝试了下面的代码,但是由于在reader.ReadByte()输入换行符之前该方法一直阻塞,因此无法获得预期的结果。

func chars() <-chan byte {
    ch := make(chan byte)
    reader := bufio.NewReader(os.Stdin)
    go func() {
        for {           
            char, err := reader.ReadByte()
            if err != nil {
                log.Fatal(err)
            }
            ch <- char
        }
    }()
    return ch
}

感谢您对我如何使每个用户输入字符无需换行符即可立即进入频道的任何建议。


阅读 215

收藏
2020-07-02

共1个答案

小编典典

默认情况下,Stdin是行缓冲的。这意味着在遇到换行符之前,它不会为您提供任何输入。这不是Go特定的事情。

使它以非缓冲的方式运行是高度特定于平台的。正如Rami所建议的那样,ncurses是一种实现方法。另一个选择是更轻便的go-
termbox
软件包。

如果您想手动完成所有操作(至少在Linux上),则可以查看为termios编写C绑定,或直接在Go中进行系统调用。

我不知道像Windows这样的平台如何处理这个问题。您可以深入研究ncurses或termbox的源代码,以了解它们的工作方式。

2020-07-02