Go 转到子例程中的频道

Go 转到子例程中的频道,go,concurrency,channel,Go,Concurrency,Channel,在围棋节目中创建频道的最佳实践是什么?为了组织和清晰,您是否应该在主例程中创建所有通道 我已经回顾了在子例程中创建通道的go代码。在子例程中创建主例程时,这些通道是否禁止主例程使用 请澄清。提前感谢。任何goroutine都可以与其范围内的任何通道进行交互,就像任何其他变量一样。频道创建于何处并不重要。然而,重要的是,通过线程进行通信的goroutine都有对通道的引用 “forking”或“parent”goroutine通常创建通道的原因是,如果子级创建了通道,它将无法与父级共享该通道。考虑

在围棋节目中创建频道的最佳实践是什么?为了组织和清晰,您是否应该在主例程中创建所有通道

我已经回顾了在子例程中创建通道的go代码。在子例程中创建主例程时,这些通道是否禁止主例程使用


请澄清。提前感谢。

任何goroutine都可以与其范围内的任何通道进行交互,就像任何其他变量一样。频道创建于何处并不重要。然而,重要的是,通过线程进行通信的goroutine都有对通道的引用

“forking”或“parent”goroutine通常创建通道的原因是,如果子级创建了通道,它将无法与父级共享该通道。考虑:

go func(){
  ch := make(chan int)
}
// how would we refer to `ch` out here?

无论是谁创建了渠道,都没有渠道“所有权”的概念。但是写入通道的goroutine确实需要引用它,这就是为什么它在“父”线程中创建并与goroutine传递或共享。否则,父级将无法从子级获取通道(您可以在通道中传递通道,但这证明了这一点!)

我在中了解了很多关于并发模型的知识。同时,我还学习了在不同的情况下在何处创建频道

例如,在管道模型中,在上游阶段创建通道,并将其传递给匿名go例程。上游阶段完成后,可关闭渠道


我希望这些文章能有所帮助。

goroutine不同于线程;这些术语是不能互换的。频道创建在哪里并不重要。通常,它被创建并传递到函数中,因为
go someFunc()
无法(传统意义上)向调用
go
的例程返回任何内容,所以这样做更容易。没有任何东西禁止goroutine创建通道并通过它与
main()
通信,这样做将按预期工作。Go有goroutine,而不是线程,它们之间没有父子关系。频道只是价值观,它们与goroutine没有任何联系。