I've got a loop in which some things happen according to the state it runs in (manual/automatic/learning). I now want to be able to let the program switch between these states by pressing the accompanying letters on the keyboard ("m" for manual, "a" for automatic and "l" for learning).
So to do this I need to be able to catch a keypress during the loop and change the variable status accordingly. I now have the following, which can catch a keypress followed by an enter:
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)
}
But the fact that I need to hit the enter button is not acceptable.
Does anybody know a non-blocking way to catch a keypress of a normal letter (not a SIGINT) without the need to hit enter afterwards?
os.Stdin.Read()
to read bytes off the wire. Your code explicitly wraps it and goes around it in order to buffer up to the next time the user presses enter. – Astern