当前位置: 首页 > 知识库问答 >
问题:

编写这段代码的更好的方式?

羊舌旭尧
2023-03-14
package main

import "fmt"

const N = 10

func main() {
    ch := make(chan int, N)
    done := make(chan bool)

    for i := 0; i < N; i++ {
        go (func(n int, ch chan int, done chan bool) {
            for i := 0; i < N; i++ {
                ch <- n*N + i
            }
            done <- true
        })(i, ch, done)
    }

    numDone := 0
    for numDone < N {
        select {
        case i := <-ch:
            fmt.Println(i)
        case <-done:
            numDone++
        }
    }

    for {
        select {
        case i := <-ch:
            fmt.Println(i)
        default:
            return
        }
    }
}

编辑:为了澄清一点,我对此表示怀疑,因为done通道似乎在做关闭通道的工作,但当然,我不能在任何goroutine中关闭通道,因为所有例程共享同一个通道。因此,我使用done来模拟一个进行某种“缓冲关闭”的通道。

Edit2:原始代码实际上并不起作用,因为有时来自例程的done信号在它刚刚对ch执行int之前被读取。需要一个“清理”循环。

共有1个答案

汪臻
2023-03-14

下面是sync.waitgroup的一个惯用用法,供您学习

(游乐场连线)

package main

import (
    "fmt"
    "sync"
)

const N = 10

func main() {
    ch := make(chan int, N)
    var wg sync.WaitGroup
    for i := 0; i < N; i++ {
        wg.Add(1)
        go func(n int) {
            defer wg.Done()
            for i := 0; i < N; i++ {
                ch <- n*N + i
            }
        }(i)
    }
    go func() {
        wg.Wait()
        close(ch)
    }()
    for i := range ch {
        fmt.Println(i)
    }
}

注意在两个go例程定义中使用了闭包,并注意第二个go语句等待所有例程完成,然后关闭通道,因此可以使用range

 类似资料:
  • 目标 遵循类大小、方法大小和方法名称的最佳实践 了解重构的重要性 保持一致的编码风格和注释用法 使用内置记录功能 最佳编码实践 您现在已经学习了本学习路径的一半内容,已经掌握了足够多的 Java 语法来编写基本 Java 程序。在继续学习更高级的主题之前,目前是一个了解一些最佳编码实践的不错时机。阅读一些可帮助您编写更干净、更可维护的 Java 代码的必要建议。 保持类小巧 目前您已经创建了一些类

  • 这就是它看起来的样子。 它工作得很好,等待数据加载,然后开始操作。但这是相当多的代码,有没有更好的方法来做它?

  • 我有一些多绑定代码,看起来像这样: 我也有一些代码,看起来像这样: Guice中有没有一种方法可以减少行数/重复次数? 编辑:不寻找像“使用for循环并迭代一组键”这样的答案。

  • 上面的代码是创建魔方的代码。我如何以更简单的形式编写下面的代码,让java初学者能够理解?

  • 你好,我是java的新手,我对如何编写JUnit测试感到困惑,有人能帮忙吗? 任务说明: 当您将自动取款机(ATM)与银行卡一起使用时,您需要使用个人识别码(PIN)来访问您的帐户。如果用户在输入PIN码时失败三次以上,机器将阻止该卡。 假设用户的PIN是“1234”,编写一个程序,向用户索要PIN不超过三次,并执行以下操作: 如果用户输入了正确的号码,请打印一条消息,说明“您的PIN是正确的”,

  • 问题内容: 我需要在预定义的时间长度内运行一些代码,当时间到时它需要停止。当前,我正在使用TimerTask来允许代码执行一段设定的时间,但这导致代码创建无尽的线程,并且效率很低。有更好的选择吗? 当前代码; 问题答案: 如果您使用的是Java5或更高版本,请考虑和。使用前者,您可以安排任务在指定的延迟后或以指定的时间间隔运行,因此,它可以更可靠地接管的角色。 该设施管理延迟(“每100毫秒运行一