2013-03-01 9 views
12

chcę mojej aplikacji pokazuje:Czytaj znak ze standardowego wejścia w Go (bez naciskania przycisku Enter)

press any key to exit ...

I kiedy wciśnięty dowolny klawisz, to wychodzi.

Jak mogę to osiągnąć?

Uwaga: Mam zgłoszenie do Google'a, ale wszystkie informacje, które znalazłem, należy nacisnąć, aby wpisać na końcu. Chcę coś jak Console.ReadKey() w języku C#.

Używam systemu MS Windows.

+3

możliwe duplikat [ Funkcja Golang podobna do getchar] (http://stackoverflow.com/questions/14094190/golang-function-similar-to-getchar) – zzzz

+1

@jnml No; to nie jest duplikat. Widziałem to pytanie wcześniej i używając kodu podanego w odpowiedzi, nadal musisz nacisnąć enter na stdin. –

+0

Dylemat dotyczy wyłącznie pytania, a nie odpowiedzi. – zzzz

Odpowiedz

9

termbox-go to lekki pakiet Go-native, który oferuje elementarne sterowanie terminalem. W tym możliwość uzyskania wejścia w trybie surowym (odczytaj po jednym znaku bez domyślnego zachowania buforowego).

Ma również dość dobrą kompatybilność w różnych systemach.

I keyboard rozszerza termbox-go, aby uzyskać dodatkowe funkcje klawiatury, takie jak skróty klawiszowe i sekwencje.

+0

To nie jest definicja trybu raw_mode. – Awn

1

Możesz odczytać pojedyncze naciśnięcie klawisza z terminala w trybie surowym. Here to pakiet, który powinien zapewniać nieprzetworzony tryb terminala dla twojego programu. Catch: to tylko Linux.

11

Jest to minimalny przykład pracy dla osób prowadzących systemu UNIX:

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)+")") 
    } 
} 
+0

Jak uzyskać wyświetlanie wprowadzonych znaków z powrotem na ekranie? – Ibolit

+0

Ibolit: Zostały już wyświetlone w przykładzie. Aby wyświetlić tylko znaki, powinno działać 'fmt.Print (string (b)). – blinry

3

Można użyć tej biblioteki (kopalnia): https://github.com/eiannone/keyboard

To jest przykład dla uzyskania jednego klawisza:

char, _, err := keyboard.GetSingleKey() 
if (err != nil) { 
    panic(err) 
} 
fmt.Printf("You pressed: %q\r\n", char) 
Powiązane problemy