2013-08-15 2 views
1

Я хочу реализовать функцию pause, такую ​​как команда оболочки Windows pause. Например,Как приостановить программу?

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

На окнах, можно использовать системную команду на golang функции exec.Command(). Но как насчет Linux? Я хочу использовать команду read -n1 -p "Any key to continue" как скомпрометированную, но она не работает в функции exec.Command("read", "-n", "1"). Я много тестировал, но не знал, почему.

Кроме того, кто-нибудь знает, как добиться функции паузы только языком голанга без использования внешней команды?

+4

[Читать строку и отбросить его] (http://golang-examples.tumblr.com/post/41863665491/read-a-line-from-stdin). –

ответ

6

Просто прочитайте от stdin. Пользователь должен будет нажать клавишу ввода для продолжения программы. Или установите терминал в «сырой» режим. Для более позднего случая, например, есть. nsf's termbox

+0

Да, я знаю, что readline от stdin может работать. Но для этого пользователю нужно ввести ключ «Enter». Я хочу знать, можем ли мы ввести любой ключ без клавиши «Enter», чтобы реализовать команду «pause». – wenlibin02

+0

@ wenlibin02: Вы действительно прочитали мой ответ? Это _is_ там ;-) – zzzz

+0

Мне жаль, что я сначала не понял, хотя я до сих пор этого не знаю. Вот еще одна реализация: http://stackoverflow.com/a/17278730/2507321, это хорошо работает! – wenlibin02

5

Читать строку из стандартного ввода, а затем выбросить его (source):

bio := bufio.NewReader(os.Stdin) 
line, hasMoreInLine, err := bio.ReadLine() 
0

не уверен, если вы можете это сделать, если вы не отключили, кроме вас uncook, то терминал (отключить входной буферизацию) > здесь simple solution к этому

Это зависит от ОС, чтобы лучше спросить у пользователя нажмите ввод. Вы также хотите, чтобы захватить сигналы, такие как 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") 
0

Наконец, я нашел следующие методы:

В Linux Shell Script:

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

В Golang для 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) 
} 

В Голанге для окон:

exec.Command("cmd", "/C", "pause")