英文:
How can I get keyboard input data in Go?
问题
我想要能够在Go语言中判断用户是否按下类似<kbd>Ctrl</kbd>+[某些键]或<kbd>Esc</kbd>这样的键盘按键。该程序在终端中运行于Linux环境中。
英文:
I want to be able to tell if a user presses things like <kbd>Ctrl</kbd>+[something] or <kbd>Esc</kbd> on their keyboard in Go. The program runs in a Linux environment inside a terminal.
答案1
得分: 3
- 如果你只想简单地读取字符串或字节,可以这样做:
 
in := bufio.NewScanner(os.Stdin)
data := in.Bytes()
- 如果你想捕获系统的信号量,可以通过注册信号量监视器来获取它:
 
signal.Notify(os.Interrupt, os.Kill) // os.Interrupt=0x2 os.Kill=0x9
- 从按键获取 ASCII 码(跨平台)(使用 github.com/nsf/termbox-go):
 
import (
	"fmt"
	term "github.com/nsf/termbox-go"
)
func main() {
	err := term.Init()
	if err != nil {
		panic(err)
	}
	defer term.Close()
	for {
		switch ev := term.PollEvent(); ev.Type {
		case term.EventKey:
			switch ev.Key {
			case term.KeyEsc:
				term.Sync()
				fmt.Println("ESC pressed")
			case term.KeyF1:
				term.Sync()
				fmt.Println("F1 pressed")
			case term.KeyInsert:
				term.Sync()
				fmt.Println("Insert pressed")
			case term.KeyDelete:
				term.Sync()
				fmt.Println("Delete pressed")
			case term.KeyHome:
				term.Sync()
				fmt.Println("Home pressed")
			case term.KeyEnd:
				term.Sync()
				fmt.Println("End pressed")
			case term.KeyPgup:
				term.Sync()
			case term.KeyArrowRight:
				term.Sync()
				fmt.Println("Arrow Right pressed")
			case term.KeySpace:
				term.Sync()
				fmt.Println("Space pressed")
			case term.KeyBackspace:
				term.Sync()
				fmt.Println("Backspace pressed")
			case term.KeyEnter:
				term.Sync()
				fmt.Println("Enter pressed")
			case term.KeyTab:
				term.Sync()
				fmt.Println("Tab pressed")
			default:
				term.Sync()
				fmt.Println("ASCII : ", ev.Ch)
			}
		case term.EventError:
			panic(ev.Err)
		}
	}
}
- 读取单个字符:
 
consoleReader := bufio.NewReaderSize(os.Stdin, 1)
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)
英文:
- If you just want to simply read the string or bytes, you can do this
 
in := bufio.NewScanner(os.Stdin)
data := in.Bytes()
- If you want to capture the system semaphore, you can get it by registering the semaphore monitor
 
signal.Notify(os.Interrupt, os.Kill) // os.Interrupt=0x2 os.Kill=0x9
- Get ASCII code from a key press(cross-platform) (use github.com/nsf/termbox-go)
 
import (
	"fmt"
	term "github.com/nsf/termbox-go"
)
func main() {
	err := term.Init()
	if err != nil {
		panic(err)
	}
	defer term.Close()
	for {
		switch ev := term.PollEvent(); ev.Type {
		case term.EventKey:
			switch ev.Key {
			case term.KeyEsc:
				term.Sync()
				fmt.Println("ESC pressed")
			case term.KeyF1:
				term.Sync()
				fmt.Println("F1 pressed")
			case term.KeyInsert:
				term.Sync()
				fmt.Println("Insert pressed")
			case term.KeyDelete:
				term.Sync()
				fmt.Println("Delete pressed")
			case term.KeyHome:
				term.Sync()
				fmt.Println("Home pressed")
			case term.KeyEnd:
				term.Sync()
				fmt.Println("End pressed")
			case term.KeyPgup:
				term.Sync()
			case term.KeyArrowRight:
				term.Sync()
				fmt.Println("Arrow Right pressed")
			case term.KeySpace:
				term.Sync()
				fmt.Println("Space pressed")
			case term.KeyBackspace:
				term.Sync()
				fmt.Println("Backspace pressed")
			case term.KeyEnter:
				term.Sync()
				fmt.Println("Enter pressed")
			case term.KeyTab:
				term.Sync()
				fmt.Println("Tab pressed")
			default:
				term.Sync()
				fmt.Println("ASCII : ", ev.Ch)
			}
		case term.EventError:
			panic(ev.Err)
		}
	}
}
- Read single characters
 
consoleReader := bufio.NewReaderSize(os.Stdin, 1)
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)
> Golang reading from stdin
> Get ASCII code from a key press
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论