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 秒后关闭,这使得第一个选择案例 (
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 的重复输入的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号