8

我想在每次对标准输入进行单独击键后将用户的击键直接发送到通道。

我尝试了下面的代码,但这并没有给出预期的结果,因为该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
}

感谢您就如何让每个用户输入字符立即进入频道而不需要换行符提供任何建议。

4

2 回答 2

10

默认情况下,标准输入是行缓冲的。这意味着它不会向您产生任何输入,直到遇到换行符。这不是 Go 特定的东西。

让它以非缓冲方式运行是高度特定于平台的。正如 Rami 所建议的,ncurses 是一种方法。另一种选择是轻得多的go-termbox包。

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

我不知道像 Windows 这样的平台如何处理这个问题。您可以深入研究 ncurses 或 termbox 的源代码,看看他们是如何做到的。

于 2012-09-11T00:49:52.347 回答
5

如果你在Linux上,你可能想看看 Goncurses 包

http://code.google.com/p/goncurses/

它具有以下功能:GetChar(),这是您想要的。

于 2012-09-11T00:35:29.410 回答