2 回答
TA贡献1816条经验 获得超4个赞
没有任何问题......它有效。但是,关闭通道确实应该是生产者的工作(而不是消费者)。
为此..我建议您将整个生产者进程移动到一个goroutine中并等待..然后关闭通道:
package main
import "fmt"
import "sync"
func main() {
ch := make(chan int, 3)
var wg sync.WaitGroup
go func() {
for i := 0; i < 3; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
ch <- i
}(i)
}
wg.Wait()
close(ch) // producer is now closing the channel
}()
// Consumer has the single responsibility of iterating over the channel
for v := range ch {
fmt.Println("consume ", v)
}
fmt.Printf("All done")
}
TA贡献1786条经验 获得超13个赞
我相信你的例子是人为的,但你的例子可以变得更简单:
ch := make(chan int, 99)
for i := 0; i < 3; i++ {
go func(i int) {
ch <- i
}(i)
}
for i := 0; i < 3; i++ {
v := <- ch
fmt.Println("consume ", v)
}
fmt.Println("All done")
您的实际代码可能更复杂,并且需要诸如 waitGroup 之类的东西,如果是这种情况,请尽您所能来解释您的具体问题。
关闭一个范围内的通道以退出该范围似乎是不惯用的围棋。
- 2 回答
- 0 关注
- 178 浏览
添加回答
举报