8

個々のキーストロークが stdin に対して行われた直後に、ユーザーのキーストロークをチャネルに直接送信したいと思います。

以下のコードを試してみましたが、reader.ReadByte()改行が入力されるまでメソッドがブロックされるため、目的の結果が得られません。

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
}

改行文字を必要とせずに、各ユーザー入力文字をすぐにチャネルに移動させる方法についてのアドバイスをありがとう.

4

2 に答える 2

10

標準入力は、デフォルトで行バッファリングされます。これは、改行が検出されるまで、入力を生成しないことを意味します。これは Go 固有のものではありません。

バッファリングされていない方法で動作させることは、プラットフォーム固有です。Rami が提案したように、ncurses はそれを行う方法です。もう 1 つのオプションは、はるかに軽量なgo-termboxパッケージです。

すべてを手動で行いたい場合 (少なくとも Linux では)、termiosの C バインディングの記述を検討するか、Go で直接 syscall を実行できます。

Windows のようなプラットフォームがこれをどのように処理するかはわかりません。ncurses または termbox のソース コードを掘り下げて、それらがどのように実行されたかを確認できます。

于 2012-09-11T00:49:52.347 に答える
5

Linuxを使用している場合は、Goncurses パッケージを参照してください。

http://code.google.com/p/goncurses/

必要な関数 GetChar() があります。

于 2012-09-11T00:35:29.410 に答える