2

我想实现pause类似windows shell命令的功能pause。例如,

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

在windows上,我们可以通过golang函数使用系统命令exec.Command()。但是在 Linux 上呢?我想将该命令read -n1 -p "Any key to continue"用作妥协的命令,但它在函数中不起作用exec.Command("read", "-n", "1")。我测试了很多,但不知道为什么。

此外,有谁知道如何不使用外部命令仅通过golang语言本身实现暂停功能?

4

4 回答 4

6

只需从标准输入读取。用户必须按 Enter 才能让您的程序继续。或者将终端设置为“原始”模式。对于后一种情况,例如。nsf 的术语框

于 2013-08-15T15:55:54.847 回答
6

从标准输入中读取一行,然后丢弃它(source):

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

我不确定你是否可以这样

这取决于操作系统,以便更好地要求用户按下回车键。您还想捕获诸如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 Shell 脚本中:

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

在 Golang for Linux 中(参考: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 回答