将击键发送到不带换行符的通道
编程中的一个常见需求是将击键从用户的输入实时发送到通道 -时间。但是,默认情况下,stdin 是行缓冲的,这意味着它需要换行符才能触发任何输入。
您提供的代码片段:
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 }
尝试实现此目的,但因失败而失败标准输入的行缓冲性质。 reader.ReadByte() 方法将阻塞,直到输入换行符。
答案中建议的一个解决方案是使用 ncurses,这是一个为终端控制提供一组函数的库。 Ncurses 允许您将终端配置为切换到非缓冲模式,确保每次击键都立即发送到通道。
另一个解决方案是使用 go-termbox 包,它提供了更高级别的 API用于处理终端上的输入和输出。使用 go-termbox,您可以在读取用户输入之前通过调用 SetInputMode(InputEsc) 来实现非缓冲输入。
对于特定于 Linux 的实现,您可以探索 termios 库或使用 syscall 包进行直接系统调用配置终端行为。应在各自的文档或源代码中研究每个平台处理缓冲输入和非缓冲输入的细节。
以上是如何将击键实时发送到不换行的通道?的详细内容。更多信息请关注PHP中文网其他相关文章!