【发布时间】:2019-06-22 15:43:04
【问题描述】:
我有一个循环,其中根据运行状态(手动/自动/学习)发生一些事情。我现在希望能够通过按键盘上的随附字母让程序在这些状态之间切换(“m”表示手动,“a”表示自动,“l”表示学习)。
所以要做到这一点,我需要能够在循环期间捕捉按键并相应地更改变量状态。我现在有以下内容,它可以捕获一个按键,然后是一个输入:
ch := make(chan string)
go func(ch chan string) {
reader := bufio.NewReader(os.Stdin)
for {
s, _ := reader.ReadString('\n')
ch <- s
}
}(ch)
for {
select {
case stdin, _ := <-ch:
fmt.Println("Keys pressed:", stdin)
default:
fmt.Println("Working..")
}
time.Sleep(time.Second)
}
但我需要按回车键的事实是不可接受的。
有没有人知道一种非阻塞方式来捕捉普通字母(不是 SIGINT)的按键而无需在之后按 Enter 键?
【问题讨论】:
-
您可以只使用
os.Stdin.Read()来从线路中读取字节。您的代码明确地包装它并绕过它,以便在用户下次按下回车时进行缓冲。
标签: go concurrency stdin keypress nonblocking