我有一个循环,根据它运行的状态(手动/自动/学习),会发生一些事情。现在我想通过按键盘上相应的字母(“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)的按键事件,而不需要之后再按回车键呢?
os.Stdin.Read()
从线路上读取字节。你的代码显式地将其包装并绕过它,以便缓冲到下一次用户按回车键。 - Adrian