2

pauseWindowsのシェルコマンドのような機能を実現したいpause。例えば、

$ go run script.go 
Any key to continue...     //Then any key to continue

Windows では、 golang function で system コマンドを使用できますexec.Command()。しかし、Linux ではどうでしょうか。コマンドを侵害されたものとして使用したいのですがread -n1 -p "Any key to continue"、関数では機能しませんexec.Command("read", "-n", "1")。私は多くのことをテストしましたが、その理由を知ることができませんでした。

また、外部コマンドを使用せずに golang 言語自体で一時停止機能を実現する方法を知っている人はいますか?

4

4 に答える 4

6

標準入力から読み取るだけです。プログラムを続行するには、ユーザーが Enter キーを押す必要があります。または、端末を「raw」モードに設定します。後者の場合、例えばがあります。nsf の用語箱

于 2013-08-15T15:55:54.847 に答える
6

標準入力から 1 行読み取り、それを破棄します ( source ):

bio := bufio.NewReader(os.Stdin)
line, hasMoreInLine, err := bio.ReadLine()
于 2013-08-15T15:57:02.243 に答える
1

端末を調理しない以外は無効にしないと、それができるかどうかわかりません(入力バッファリングを無効にします)>これに対する簡単な解決策は次のとおりです

これは OS に依存し、ユーザーに Enter キーを押すように促します。Ctrl+ZまたはCtrl+Cなどの信号もキャプチャする必要があります。

c := make(chan os.Signal)
d := make(chan bool)

// Capture Control
signal.Notify(c, os.Interrupt, os.Kill)

//Capture Enter
go func() {
    bio := bufio.NewReader(os.Stdin)
    bio.ReadByte()
    d <- true
}()


fmt.Println("Any key to continue... ")

// Block
select {
    case <- d :
    case <- c :
}

fmt.Println("Mission Completed")
于 2013-08-15T17:18:51.127 に答える
-1

最後に、次の方法を見つけました。

Linux シェル スクリプトの場合:

echo -ne "press any key to continue..."; stty -echo; read -n1; stty echo

Linux 用の Golang (参照: https://stackoverflow.com/a/17278730/2507321 ):

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)

    fmt.Printf("any key to continue...")
    os.Stdin.Read(b)
}

Windows 用の Golang の場合:

exec.Command("cmd", "/C", "pause")
于 2013-08-16T16:01:40.427 に答える