将stdin键击发送到通道而不需要换行符

时间:2012-09-10 23:00:08

标签: go channel

我想在每次单独击键到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
}

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

2 个答案:

答案 0 :(得分:10)

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

使其以非缓冲方式运行是高度特定于平台的。正如拉米所说,ncurses是一种方法。另一个选择是更轻的go-termbox包。

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

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

答案 1 :(得分:4)

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

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

它具有以下功能:GetChar()就是你想要的。