2012-09-10 10 views
8

各キーストロークを標準入力にした直後に、ユーザーのキーストロークをチャンネルに送信したいと思います。改行なしで標準入力をチャンネルに送る

私は以下のコードを試しましたが、改行が入力されるまで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 
} 

私は、各ユーザの入力文字が改行文字を必要とせずにチャンネルにすぐに行くことになるかもしれない方法上の任意のアドバイスをいただき、ありがとうございます。

答えて

10

デフォルトでは、Stdinはラインバッファです。これは、改行に遭遇するまで、あなたに何の入力ももたらさないことを意味します。これはGo固有のものではありません。

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

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

Windowsのようなプラットフォームがこれを処理する方法はわかりません。 ncursesやtermboxのソースコードを掘り下げて、彼らがどのようにしたのか見ることができます。

+0

ありがとうございます。私は私の質問をしてうれしく思っています。あるいは、これをもっと長く働かせようと努力していたのです。いずれにしても、私はtermbox/ncursesがあなたとRamiの言葉を提案するのが好きです。私はこのアプローチを考えたことはありませんでしたが、特にtermboxは非常にアクセス可能に見え、とにかく私が望むものを正確に行うべきです。 – Kim

4

あなたはのLinux上にある場合、あなたはGoncursesパッケージで

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

を見たいと思うかもしれませんそれは機能を持っていますGETCHAR()あなたが望むものです。

関連する問題