web-dev-qa-db-ja.com

Goの標準入力から文字を読み取ります(Enterキーを押さずに)

アプリに表示したい:

_press any key to exit ..._

そして、anyキーを押すと、終了します。

どうすればこれを達成できますか?

注:私はグーグルで検索しましたが、最後にenterを押す必要がありました。 C#でConsole.ReadKey()のようなものが欲しいです。

私はMSWindowsを実行しています。

20

termbox-go は、いくつかの基本的な端末制御を提供する軽量のGo-nativeパッケージです。 rawモードで入力を取得する機能を含みます(デフォルトの行バッファー動作なしで一度に1文字を読み取ります)。

また、さまざまなシステム間でかなり良好な互換性があります。

そして keyboard termbox-goを拡張して、マルチキーショートカットやシーケンスなどの追加のキーボード機能を提供します。

11
jimt

これは、UNIXシステムを実行している人にとって最小限の作業例です。

package main

import (
    "fmt"
    "os"
    "os/exec"
)

func main() {
    // disable input buffering
    exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run()
    // do not display entered characters on the screen
    exec.Command("stty", "-F", "/dev/tty", "-echo").Run()

    var b []byte = make([]byte, 1)
    for {
        os.Stdin.Read(b)
        fmt.Println("I got the byte", b, "("+string(b)+")")
    }
}
17
blinry

go-termboxは非常に重いです。ターミナルウィンドウ全体を引き継ぎたい。たとえば、起動時に画面をクリアしますが、これは希望どおりでない場合があります。

これをOSXにまとめました。ほんの小さなgetchar():

https://github.com/paulrademacher/climenu/blob/master/getchar.go

8
Paul Rademacher

このライブラリ(私のもの)を使用できます: https://github.com/eiannone/keyboard

これは、単一のキーストロークを取得するための例です。

char, _, err := keyboard.GetSingleKey()
if (err != nil) {
    panic(err)
}
fmt.Printf("You pressed: %q\r\n", char)
5
Emanuele

Rawモードの端末から1回のキー押下を読み取ることができます。 Here は、プログラムにrawターミナルモードを提供するパッケージです。キャッチ:Linuxのみです。

2
zzzz

これを試してください- http://play.golang.org/p/kg-QirlucY

os.Stdinの最後にあるfunc mainから読んでください。

1
alex