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:
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
Tutorials
+34.1k Golang : Smarter Error Handling with strings.Contains()
+13.7k Golang : Reverse IP address for reverse DNS lookup example
+23.2k Golang : minus time with Time.Add() or Time.AddDate() functions to calculate past date
+39.6k Golang : Convert to io.ReadSeeker type
+22k Golang : Read directory content with filepath.Walk()
+35.4k Golang : Get file last modified date and time
+7.8k Golang : Multiplexer with net/http and map
+7.9k Golang : How To Use Panic and Recover
+19.7k Swift : Convert (cast) Int to int32 or Uint32
+40.7k Golang : How to check if a string contains another sub-string?
+5.8k Golang : Measure execution time for a function
+11.7k Golang : How to parse plain email text and process email header?