2013-03-01 9 views
12

ich meine app will zeigt:ein Zeichen von der Standardeingabe in Go lesen (ohne Enter)

press any key to exit ...

Und wenn ich jede Taste gedrückt, es verlässt.

Wie kann ich das erreichen?

Hinweis: Ich habe gegoogelt, aber alles, was ich gefunden habe, musste drücken eingeben am Ende. Ich möchte etwas wie Console.ReadKey() in C#.

Ich verwende MS Windows.

+3

möglich Duplikat von [ Golang-Funktion ähnlich wie getchar] (http://stackoverflow.com/questions/14094190/golang-function-similar-to-getchar) – zzzz

+1

@jnml Nein; Dies ist kein Duplikat. Ich habe diese Frage schon vorher gesehen und benutze den Code, der in der Antwort angegeben wurde, aber du musst noch die Eingabetaste drücken. –

+0

Bei der Duplizität geht es ausschließlich um die Frage, nicht um irgendeine Antwort darauf. – zzzz

Antwort

9

termbox-go ist ein leichtes Go-natives Paket, das eine rudimentäre Terminalsteuerung bietet. Einschließlich der Fähigkeit, Eingaben im Rohmodus zu erhalten (Lesen eines Zeichens zu einem Zeitpunkt ohne das standardmäßige zwischengespeicherte Verhalten).

Es hat auch ziemlich ok Kompatibilität über verschiedene Systeme.

Und keyboard erweitert termbox-go, um einige zusätzliche Tastaturfunktionen wie Multi-Tastenkombinationen und Sequenzen zu geben.

+0

Das ist nicht die Definition von raw_mode. – Awn

1

Sie können einen einzelnen Tastendruck von einem Terminal im Rohmodus lesen. Here ist ein Paket, das Ihrem Programm einen rohen Terminal-Modus zur Verfügung stellen sollte. Catch: Es ist nur Linux.

11

Dies ist ein minimal funktionierendes Beispiel für diejenigen, die ein UNIX-System unter:

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

Wie erhalten Sie die Anzeige der eingegebenen Zeichen zurück auf dem Bildschirm? – Ibolit

+0

Ibolit: Sie werden bereits im Beispiel angezeigt. Um nur die Zeichen anzuzeigen, sollte 'fmt.Print (string (b)) 'funktionieren. – blinry

5

go-termbox func main las sehr Schwergewicht. Es möchte das gesamte Terminalfenster übernehmen. Beispielsweise wird der Bildschirm beim Start gelöscht, was möglicherweise nicht Ihren Vorstellungen entspricht.

Ich habe dies auf OSX zusammen. Nur eine winzige getchar():

https://github.com/paulrademacher/climenu/blob/master/getchar.go

3

könnten Sie diese Bibliothek verwenden (von dir): https://github.com/eiannone/keyboard

Das ein Beispiel ist einen einzigen Tastendruck für immer:

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