我有一个循环,其中一些事情根据它运行的状态(手动/自动/学习)发生。我现在希望能够通过按键盘上的附带字母(“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() 并发现这个答案 https://stackoverflow.com/a/17278776/1650012我创建了以下代码:
package main
import (
"fmt"
"os"
"time"
"os/exec"
)
func main() {
ch := make(chan string)
go func(ch chan string) {
// disable input buffering
exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run()
// do not display entered characters on the screen
exec.Command("stty", "-F", "/dev/tty", "-echo").Run()
var b []byte = make([]byte, 1)
for {
os.Stdin.Read(b)
ch <- string(b)
}
}(ch)
for {
select {
case stdin, _ := <-ch:
fmt.Println("Keys pressed:", stdin)
default:
fmt.Println("Working..")
}
time.Sleep(time.Millisecond * 100)
}
}
这就像一个魅力。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)