Golang频道发行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang频道发行相关的知识,希望对你有一定的参考价值。

我有一个简单的渠道示例:https://play.golang.org/p/eLcpzXeCHms

package main

import (
    "fmt"
)

func execute(trueChan chan<- bool, lowerRange int32, upperRange int32) 
    for lowerRange <= upperRange 
        fmt.Printf("\nhandling number %v", lowerRange)
        if lowerRange%2 == 0 
            go func() 
                trueChan <- true
            ()
        
        lowerRange++
    
    close(trueChan)


func main() 
    counter := 0

    trueChan := make(chan bool)

    execute(trueChan, 5, 25)

    for 
        if _, ok := <-trueChan; ok 
            counter++
         else 
            break
        
    

    fmt.Printf("\n%v", counter)

第一个问题:有时会收到错误消息...

handling number 5
handling number 6
handling number 7
handling number 8
handling number 9
handling number 10
handling number 11
handling number 12
handling number 13
handling number 14
handling number 15
handling number 16
handling number 17
handling number 18
handling number 19
handling number 20
handling number 21
handling number 22
handling number 23
handling number 24
handling number 25
0
panic: send on closed channel

还有第二个问题-我的计数器始终为0。

有人可以提示我,我在做什么错吗?

答案

您的代码:

  1. 创建一个无缓冲的通道trueChan
  2. 创建10个goroutine,每个goroutine将尝试写入trueChan,它将阻塞直到从中读取某些内容。
  3. 关闭trueChan,然后返回到main()
  4. [main()打印0,因为它尚未从goroutine中读取任何内容
  5. 同时,由于在步骤3中关闭了trueChan,因此在使用goroutine之前,第一个尝试写入通道紧急情况的goroutine

[至少,您不应该关闭trueChan,直到您知道所有goroutine都已完成。实际上,您要在他们甚至begin使用它之前就关闭它。

A sync.WaitGroup可能是实现此目的的一种方法,但是在您的代码中如何实现它并不明显,因为我不确定您的目标是什么。这段代码看起来像一个简单的练习,而不是真实的示例。如果您能解释您的目标,我可能会提供更具体的建议。

另一答案

您的第一个和第二个问题都在同一个根源:您在主例程

以上是关于Golang频道发行的主要内容,如果未能解决你的问题,请参考以下文章

golang [频道]频道的使用#channel

golang [去阻塞频道]与Go#golang,#go,#go channels,#go synchronization,#goroutines,#waitgroups中的频道同步和阻止,

为啥我的 Golang 频道写入永远阻塞?

Golang频道睡着了

golang 合并频道

golang Gen频道