Heim  >  Artikel  >  Backend-Entwicklung  >  Wie sende ich Tastenanschläge in Echtzeit an einen Kanal ohne Zeilenumbruch?

Wie sende ich Tastenanschläge in Echtzeit an einen Kanal ohne Zeilenumbruch?

DDD
DDDOriginal
2024-10-30 07:41:02243Durchsuche

How to Send Keystrokes to a Channel Without Newline in Real Time?

Senden von Tastenanschlägen an einen Kanal ohne Zeilenumbruch

Ein häufiger Bedarf bei der Programmierung besteht darin, Tastenanschläge von der Benutzereingabe in Echtzeit an einen Kanal zu senden. Zeit. Standardmäßig ist stdin jedoch zeilengepuffert, was bedeutet, dass ein Zeilenumbruchzeichen erforderlich ist, um eine Eingabe auszulösen.

Der von Ihnen bereitgestellte Codeausschnitt:

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
}

versucht dies zu erreichen, schlägt jedoch fehl zur zeilengepufferten Natur von stdin. Die Methode „reader.ReadByte()“ blockiert, bis eine neue Zeile eingegeben wird.

Eine Lösung, wie in der Antwort vorgeschlagen, ist die Verwendung von ncurses, einer Bibliothek, die eine Reihe von Funktionen für die Terminalsteuerung bereitstellt. Mit Ncurses können Sie das Terminal so konfigurieren, dass es in den nicht gepufferten Modus wechselt und so sicherstellt, dass jeder Tastendruck sofort an den Kanal gesendet wird.

Eine andere Lösung ist die Verwendung des go-termbox-Pakets, das eine API auf höherer Ebene bereitstellt zum Arbeiten mit Ein- und Ausgabe am Terminal. Mit go-termbox können Sie eine nicht gepufferte Eingabe erreichen, indem Sie SetInputMode(InputEsc) aufrufen, bevor Sie Benutzereingaben lesen.

Für Linux-spezifische Implementierungen können Sie die Termios-Bibliothek erkunden oder direkte Systemaufrufe mit dem Syscall-Paket durchführen Konfigurieren Sie das Terminalverhalten. Die Besonderheiten der Handhabung gepufferter und nicht gepufferter Eingaben durch jede Plattform sollten in der jeweiligen Dokumentation oder im Quellcode untersucht werden.

Das obige ist der detaillierte Inhalt vonWie sende ich Tastenanschläge in Echtzeit an einen Kanal ohne Zeilenumbruch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn