【问题标题】:In goLang why are we creating the channel inside a for loop each time在 goLang 中,为什么我们每次都在 for 循环中创建通道
【发布时间】:2021-04-05 23:30:31
【问题描述】:

我正在尝试通过在线学习不同的示例来学习 goLang。在这个示例中,它是一个测验测试,其中向用户提供带有问题和答案的 CSV 文件,如果用户在给定时间内未回答 Q,则计时器将触发。我在下面的代码中不明白为什么我们每次都在 for 循环中为每个不同的问题创建答案通道。为什么我们不能在 for 循环之外定义计时器并将其用于每个问题,这不是低效的编码吗?

problemloop:
    for i, p := range problems {
        fmt.Printf("Problem #%d: %s = ", i+1, p.q)
        answerCh := make(chan string)
        go func() {
            var answer string
            fmt.Scanf("%s\n", &answer)
            answerCh <- answer
        }()

        select {
        case <-timer.C:
            fmt.Println()
            break problemloop
        case answer := <-answerCh:
            if answer == p.a {
                correct++
            }
        }
    }

【问题讨论】:

    标签: go


    【解决方案1】:

    在 Go 中,创建通道非常便宜。因此,创建一个传递给 goroutine 的“答案通道”是一个常见的习惯用法。 Goroutine 不能像函数那样将值返回给调用者。当 goroutine 完成后,它将其答案/结果发送到通道。在主(或其他消费者)goroutine 中在此通道上接收用作同步点。并允许超时,如您的示例所示。

    除非您可以通过分析证明这是热门路径,否则我不会担心这里的效率。这段代码很可能是用单通道编写的,但看你提供的小 sn-p 很难说。

    【讨论】:

    • 谢谢它实际上有两个通道,一个通道用于排除用户使用 scanf 输入的通道,另一个是到期的计时器。你对 Go 例程的解释其实让我理解了一点,因为我不知道它主要用于通道
    • @user3556956:乐于助人!正确的思考方式是使用通道在 goroutine 之间进行通信。我强烈建议您观看此演讲:blog.golang.org/waza-talk(Rob Pike 的“并发不是并行性”)
    • 伟大的概念......在编程中,并发是独立执行进程的组合,而并行是同时执行(可能相关的)计算。并发是一次处理很多事情。并行就是一次做很多事情。
    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多