php小编苹果在这篇文章中将向大家介绍一个重要的注意事项:“不接受来自 stdin 的重复输入”。在编程中,我们经常会使用stdin作为输入源,但是重复的输入可能会导致程序出现错误或不可预测的行为。因此,我们需要注意在使用stdin时避免输入的重复,以确保程序的正常运行。在接下来的文章中,我们将详细探讨这个问题,并提供一些解决方案和实践建议,帮助读者更好地处理stdin输入的重复情况。
问题内容
我有一个人为的程序,其目标是在标准输入上回显文本(根据需要多次),并在 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)
}
}
问题是当我输入第一行文本时,它会回显到标准输出并且程序退出。我想在 10 秒内输入尽可能多的命令。
我做错了什么?
解决方法
中止通道在 10 秒后关闭,这使得第一个选择案例 (<-abort) 被触发并退出程序。这是我得到的
func main() {
input := make(chan string)
abort := make(chan bool)
// exit after 10 sec
go func() {
time.Sleep(10 * time.Second)
close(abort) // Close the channel after 10 seconds
}()
go func() {
cmd := bufio.NewScanner(os.Stdin)
for cmd.Scan() {
input <- "<- " + cmd.Text()
}
}()
for {
select {
case <-abort:
fmt.Println("closing connection")
return
case cmd := <-input:
fmt.Println(cmd)
}
}
}'
我使用“for”将外部 select 语句替换为无限循环 10 秒超时后,我使用 close(abort) 语句关闭中止通道。这将告诉 select 语句已发生超时,并且当通道关闭时应继续执行第一种情况 (