ホームページ >バックエンド開発 >Golang >リアルタイムで改行なしでキーストロークをチャネルに送信するにはどうすればよいですか?

リアルタイムで改行なしでキーストロークをチャネルに送信するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-30 07:41:02300ブラウズ

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

改行なしでキーストロークをチャネルに送信する

プログラミングにおける一般的なニーズは、ユーザーの入力からチャネルにキーストロークを実際に送信することです。時間。ただし、デフォルトでは、stdin は行バッファリングされます。つまり、入力をトリガーするには改行文字が必要です。

指定したコード スニペット:

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
}

これを達成しようとしますが、次の理由で失敗します。 stdin のラインバッファリングの性質に影響されます。 Reader.ReadByte() メソッドは、改行が入力されるまでブロックします。

回答で提案されているように、1 つの解決策は、端末制御用の一連の関数を提供するライブラリである ncurses を使用することです。 Ncurses を使用すると、端末を非バッファ モードに切り替えるように設定でき、各キーストロークがすぐにチャネルに送信されるようになります。

もう 1 つの解決策は、より高レベルの API を提供する go-termbox パッケージを使用することです。端末の入力と出力を操作するためのものです。 go-termbox を使用すると、ユーザー入力を読み取る前に SetInputMode(InputEsc) を呼び出すことで、バッファなしの入力を実現できます。

Linux 固有の実装の場合は、termios ライブラリを探索するか、syscall パッケージを使用して直接 syscall を行うことができます。端末の動作を設定します。各プラットフォームのバッファリングされた入力とバッファリングされていない入力の処理の詳細については、それぞれのドキュメントまたはソース コードで調査する必要があります。

以上がリアルタイムで改行なしでキーストロークをチャネルに送信するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。