Golang频道发行

问题描述 投票:-1回答:2

我有一个简单的渠道示例: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。

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

go concurrency channel
2个回答
2
投票

您的代码:

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.