2012-09-10 7 views
8

Ich möchte die Tastenanschläge des Benutzers direkt nach jedem einzelnen Tastendruck an die Standardeingabe senden.Senden von stdin-Tastenanschlägen an den Kanal ohne Zeilenumschaltung erforderlich

Ich habe versucht, den folgenden Code, aber das gibt nicht das gewünschte Ergebnis, weil die reader.ReadByte()-Methode blockiert, bis Newline eingegeben wird.

func chars() <-chan byte { 
    ch := make(chan byte) 
    reader := bufio.NewReader(os.Stdin) 
    go func() { 
     for {   
      char, err := reader.ReadByte() 
      if err != nil { 
       log.Fatal(err) 
      } 
      ch <- char 
     } 
    }() 
    return ch 
} 

Vielen Dank für jede Beratung, wie könnte ich jeden Benutzer Eingabezeichen bekommen, ohne die Notwendigkeit für eine neue Zeile Zeichen unmittelbar an den Kanal zu gehen.

Antwort

10

Stdin ist standardmäßig gepuffert. Das bedeutet, dass Sie keine Eingabe erhalten, bis ein Zeilenumbruch gefunden wird. Das ist keine Go-spezifische Sache.

Das Verhalten auf nicht gepufferte Weise ist sehr plattformspezifisch. Wie Rami vorgeschlagen hat, ist ncurses eine Möglichkeit, dies zu tun. Eine weitere Option ist das viel leichtere go-termbox Paket.

Wenn Sie alles manuell (zumindest unter Linux) machen möchten, können Sie C-Bindungen für termios schreiben oder syscalls direkt in Go ausführen.

Wie Plattformen wie Windows damit umgehen, weiß ich nicht. Sie können in den Quellcode für ncurses oder termbox eintauchen, um zu sehen, wie sie es gemacht haben.

+0

Danke für die Info. Ich bin froh, dass ich meine Frage gestellt habe, oder ich hätte erfolglos herumgespuckt und versucht, es noch länger zur Arbeit zu bringen. Auf jeden Fall mag ich die von dir und Rami erwähnten termbox/ncurses-Vorschläge. Ich habe diesen Ansatz nie in Betracht gezogen, aber Termbox scheint besonders zugänglich zu sein und sollte genau das tun, was ich will. – Kim