Reputation: 13521
I want my app to show:
press any key to exit ...
And to exit when I press any key.
How can I achieve this?
Note: I have googled but all of what I've found needed to press Enter at the end. I want something like Console.ReadKey()
in C#.
I am running MS Windows.
Upvotes: 43
Views: 36621
Reputation: 692
The package "golang.org/x/term" allows you to switch the stdin into raw mode to read each byte at a time.
package main
import (
"fmt"
"os"
"golang.org/x/term"
)
func main() {
// switch stdin into 'raw' mode
oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
if err != nil {
fmt.Println(err)
return
}
defer term.Restore(int(os.Stdin.Fd()), oldState)
b := make([]byte, 1)
_, err = os.Stdin.Read(b)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("the char %q was hit", string(b[0]))
}
Upvotes: 15
Reputation: 617
You could use this library (mine): https://github.com/eiannone/keyboard
This is an example for getting a single keystroke:
char, _, err := keyboard.GetSingleKey()
if (err != nil) {
panic(err)
}
fmt.Printf("You pressed: %q\r\n", char)
Upvotes: 10
Reputation: 2248
Try this - http://play.golang.org/p/kg-QirlucY.
Just read from the os.Stdin
at the end of the func main
Upvotes: 0
Reputation: 3011
go-termbox is very heavyweight. It wants to take over the entire terminal window. For example, it clears the screen on startup, which may not be what you want.
I put this together on OSX. Just a tiny getchar():
https://github.com/paulrademacher/climenu/blob/master/getchar.go
Upvotes: 10
Reputation: 4965
This is a minimal working example for those running a UNIX system:
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
// 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)
fmt.Println("I got the byte", b, "("+string(b)+")")
}
}
Upvotes: 39
Reputation: 26437
termbox-go is a light-weight Go-native package which offers some rudimentary terminal control. Including the ability to get input in raw mode (read one character at a time without the default line-buffered behaviour).
It also has fairly ok compatibility across different systems.
And keyboard extends termbox-go to give some additional keyboard functionality like multi-key shortcuts and sequences.
Upvotes: 15