2014-11-29 14 views
7

Tôi có một ứng dụng REPL tại Gò rằng nên phản ứng với sự kiện báo chí bàn phím (hành động riêng biệt cho mỗi phím bấm key) nhưng ReadString hy vọng cho phím quay lại để được ép trước khi đọc os.Stdin:Cách phản ứng với các sự kiện nhấn phím trong Go?

import (
    "bufio" 
    "os" 
) 

for { 
    reader := bufio.NewReader(os.Stdin) 
    key, _ := reader.ReadString('\n') 
    deferKey(key) 
} 

Làm thế nào tôi có thể phản ứng với sự kiện nhấn phím trong Go?

+2

có thể trùng lặp của [Hàm Golang tương tự như getchar] (http://stackoverflow.com/questions/14094190/golang-function-similar-to-getchar) – LinearZoetrope

+0

vì vậy tôi cần phải sử dụng ncurses? Không có cách nào để làm điều đó với đi xây dựng trong gói? – marcio

+1

https://github.com/zetamatta/nyagos hoặc https://github.com/rocky/go-fish/blob/d44fd886cb8de9df818211c5692814deeadb0651/repl.go có thể cung cấp cho bạn một số manh mối, nhưng tôi không chắc chắn có một cách nền tảng. – VonC

Trả lời

3

Công cụ trò chơi thường triển khai loại chức năng này. Họ thường cũng khá nhiều nền tảng bất khả tri (thường là ít nhất là Windows, Linux, Mac OS X). Hãy thử ví dụ Azul3D's keyboard library.

Logic là ra khỏi đỉnh của một cái gì đầu tôi như

watcher := keyboard.NewWatcher() 
// Query for the map containing information about all keys 
status := watcher.States() 
left := status[keyboard.ArrowLeft] 
if left == keyboard.Down { 
    // The arrow to left is being held down 
    // Do something! 
} 

Bắt một danh sách những gì phím hiện đang được ép xuống là một vấn đề lặp lại bản đồ thông qua và niêm yết các phím mà giá trị là Down.

+0

Tôi đã kết thúc bằng cách sử dụng ncurses. Nhưng tôi sẽ thử điều này bởi vì tôi không thực sự cần tất cả các bloat từ một thư viện nguyền rủa. – marcio

+2

vâng, nhưng ai đang điền vào bản đồ đó, một cái gì đó phải thiết lập các tiểu bang, thư viện này sẽ không làm việc cho những gì bạn cần. – leonarth

+0

Dường như không hoạt động trên Linux. – Matt

Các vấn đề liên quan