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

Kim*_*Kim 7 channel 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
}
Run Code Online (Sandbox Code Playgroud)

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

jim*_*imt 10

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

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

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

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


Ram*_*rar 5

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

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

它具有您想要的功能:GetChar()。