PHP小编苹果在这篇文章中将向大家介绍一个重要的注意事项:“不接受来自 stdin 的重复输入”。在编程中,我们经常会使用stdin作为输入源,但是重复的输入可能会导致程序出现错误或不
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 语句已发生超时,并且当通道关闭时应继续执行第一种情况 (
以上就是不接受来自 stdin 的重复输入的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: 不接受来自 stdin 的重复输入
本文链接: https://lsjlt.com/news/562114.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0