在go编程中创建频道的最佳实践是什么?为了组织清楚,您是否应在主例程中创建所有渠道?
我已经查看了在子例程中创建通道的go代码。在子例程中创建主例程时,这些通道是否超出了主例程的范围?
请澄清。预先感谢。
答案 0 :(得分:6)
任何goroutine都可以与其范围内的任何通道 交互,就像其他任何变量一样。通道的创建位置并不重要。但是,重要的是,通过线程进行通信的goroutine都具有对该通道的引用。
“派生”或“父” goroutine通常创建通道的原因是,如果子级创建了该通道,则它将无法与父级共享。考虑:
go func(){
ch := make(chan int)
}
// how would we refer to `ch` out here?
谁创建频道都没有关系,没有频道“所有权”的概念。但是写入通道的goroutine确实需要引用它,这就是为什么它在“父”线程中创建并与goroutine传递或共享的原因。否则,父母将无法从孩子那里获得频道(您可以在频道中通过频道,但这种方式很重要!)
答案 1 :(得分:1)
我在Go recommend articles中了解了很多有关并发模型的知识。而且我了解了如何同时在不同情况下创建渠道。
例如,在Pipeline模型中,在上游阶段创建一个通道,并将其传递给匿名go例程。上游阶段结束后,可以关闭通道。
我希望这些文章对您有所帮助。