返回顶部
首页 > 资讯 > 精选 >不接受来自 stdin 的重复输入
  • 289
分享到

不接受来自 stdin 的重复输入

2024-02-08 22:02:13 289人浏览 泡泡鱼
摘要

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

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作