我有一个人为的程序,目标是在标准输入中回显文本(你想回显多少次就回显多少次),并在10秒后退出。代码如下:
package main
import (
"bufio"
"fmt"
"os"
"time"
)
func main() {
input := make(chan string)
abort := make(chan bool)
// exit after 10 sec
go func() {
time.Sleep(10 * time.Second)
abort <- true
}()
go func() {
cmd := bufio.NewScanner(os.Stdin)
for cmd.Scan() {
input <- "<- " + cmd.Text()
}
}()
select {
case <-abort:
fmt.Println("exiting")
return
case cmd := <-input:
fmt.Println(cmd)
}
}
问题是当我输入第一行文本时,它被回显到stdout,程序退出。我想在10秒内输入任意多的命令。
我做错了什么?
1条答案
按热度按时间r1zhe5dt1#
中止通道在10秒后关闭,这使得第一个选择情况(<-中止)被触发并且程序退出。这是我得到的
我使用'for'将外部select语句替换为无限循环。10秒超时后,我使用close(abort)语句关闭abort的通道。这将告诉select语句发生了超时,当通道关闭时,它应该继续第一种情况(<-abort)。我有一个塞齐尔打字,所以我希望你得到它。