Golang : Get ASCII code from a key press(cross-platform) example




Problem:

Somehow you are feeling nostalgic and played some retro games from the 80s such as Load Runner and during the game, you realized that the game was created back when there is no computer mouse yet(at least not available to the masses). The game response to keystrokes only.

You want to create a Golang program that can accept a single key press without the user having to hit Enter button afterward and translate the key into ASCII code.

You started to explore possible Golang solutions out there that are able to parse a single character or single key press event. Trouble was that those solutions are not portable(non-cross-platform). You either have to code it for Windows or Darwin/Linux/Unix platform.

Is there any cross-platform solution?

Solution:

This is a barebone cross-platform example of getting a single character without having to hit the Enter button.

 package main

 import (
 "fmt"
 term "github.com/nsf/termbox-go"
 )

 func reset() {
 term.Sync() // cosmestic purpose
 }

 func main() {
 err := term.Init()
 if err != nil {
 panic(err)
 }

 defer term.Close()

 fmt.Println("Enter any key to see their ASCII code or press ESC button to quit")

 keyPressListenerLoop:
 for {
 switch ev := term.PollEvent(); ev.Type {
 case term.EventKey:
 switch ev.Key {
 case term.KeyEsc:
 break keyPressListenerLoop
 case term.KeyF1:
 reset()
 fmt.Println("F1 pressed")
 case term.KeyF2:
 reset()
 fmt.Println("F2 pressed")
 case term.KeyF3:
 reset()
 fmt.Println("F3 pressed")
 case term.KeyF4:
 reset()
 fmt.Println("F4 pressed")
 case term.KeyF5:
 reset()
 fmt.Println("F5 pressed")
 case term.KeyF6:
 reset()
 fmt.Println("F6 pressed")
 case term.KeyF7:
 reset()
 fmt.Println("F7 pressed")
 case term.KeyF8:
 reset()
 fmt.Println("F8 pressed")
 case term.KeyF9:
 reset()
 fmt.Println("F9 pressed")
 case term.KeyF10:
 reset()
 fmt.Println("F10 pressed")
 case term.KeyF11:
 reset()
 fmt.Println("F11 pressed")
 case term.KeyF12:
 reset()
 fmt.Println("F12 pressed")
 case term.KeyInsert:
 reset()
 fmt.Println("Insert pressed")
 case term.KeyDelete:
 reset()
 fmt.Println("Delete pressed")
 case term.KeyHome:
 reset()
 fmt.Println("Home pressed")
 case term.KeyEnd:
 reset()
 fmt.Println("End pressed")
 case term.KeyPgup:
 reset()
 fmt.Println("Page Up pressed")
 case term.KeyPgdn:
 reset()
 fmt.Println("Page Down pressed")
 case term.KeyArrowUp:
 reset()
 fmt.Println("Arrow Up pressed")
 case term.KeyArrowDown:
 reset()
 fmt.Println("Arrow Down pressed")
 case term.KeyArrowLeft:
 reset()
 fmt.Println("Arrow Left pressed")
 case term.KeyArrowRight:
 reset()
 fmt.Println("Arrow Right pressed")
 case term.KeySpace:
 reset()
 fmt.Println("Space pressed")
 case term.KeyBackspace:
 reset()
 fmt.Println("Backspace pressed")
 case term.KeyEnter:
 reset()
 fmt.Println("Enter pressed")
 case term.KeyTab:
 reset()
 fmt.Println("Tab pressed")

 default:
 // we only want to read a single character or one key pressed event
 reset()
 fmt.Println("ASCII : ", ev.Ch)

 }
 case term.EventError:
 panic(ev.Err)
 }
 }
 }

Sample output:

Enter any key to see their ASCII code or press ESC button to quit

Tab pressed

ASCII : 49

ASCII : 50

ASCII : 51

ASCII : 52

ASCII : 53

F1 pressed

Arrow Up pressed

Arrow Left pressed

Arrow Down pressed

Arrow Right pressed

Arrow Up pressed

If you don't mind hitting the Enter button after. See this solution:

 package main

 import (
 "fmt"
 "os"
 "bufio"
 )



 func main() {

 fmt.Println("Press ESC button or Ctrl-C to exit this program")
 fmt.Println("Press any key to see their ASCII code follow by Enter")

 for {
 // only read single characters, the rest will be ignored!!
 consoleReader := bufio.NewReaderSize(os.Stdin, 1)
 fmt.Print(">")
 input, _ := consoleReader.ReadByte()

 ascii := input

 // ESC = 27 and Ctrl-C = 3
 if ascii == 27 || ascii == 3 {
 fmt.Println("Exiting...")
 os.Exit(0)
 }

 fmt.Println("ASCII : ", ascii)
 }

 }

Hope this helps!

References:

https://godoc.org/github.com/nsf/termbox-go#Event

http://stackoverflow.com/questions/15159118/read-a-character-from-standard-input-in-go-without-pressing-enter

  See also : Golang : Get input from keyboard





By Adam Ng

IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.


Advertisement