Concurrency 函数中作为参数传递通道的不同方法

Concurrency 函数中作为参数传递通道的不同方法,concurrency,go,channel,Concurrency,Go,Channel,我读了一些围棋代码,并说了一些不同的方式通过围棋频道。也许它们是相同的,但我想知道是否有任何不同,因为我无法在网上找到文档: (一) (四) 我想知道它们之间的区别是什么,它们是否只是做同一件事的等效方法:在不同的goroutine之间传递一个通道 注意:我知道没有理由传递指向chan、map、slice或函数值的指针,因为这些都是内部包含指针的引用类型(如果希望被调用方更改引用类型头,则例外)。我提供它的唯一原因是为了完整性(即,真正提供一个通道可以尝试作为参数传递的每一种方式,并提出一个问题

我读了一些围棋代码,并说了一些不同的方式通过围棋频道。也许它们是相同的,但我想知道是否有任何不同,因为我无法在网上找到文档:

(一)

(四)

我想知道它们之间的区别是什么,它们是否只是做同一件事的等效方法:在不同的goroutine之间传递一个通道


注意:我知道没有理由传递指向chan、map、slice或函数值的指针,因为这些都是内部包含指针的引用类型(如果希望被调用方更改引用类型头,则例外)。我提供它的唯一原因是为了完整性(即,真正提供一个通道可以尝试作为参数传递的每一种方式,并提出一个问题,希望引用所有的方法来实现这一点并对它们进行比较)。

这些是不同的通道类型。看见对于指针内容:不常见,但如果您想从函数内部更改通道(在野外从未见过),则可能会很有用。

我始终建议在任何可能的地方传递方向,例如

func serve(ch <-chan SomeType) { /*do stuff*/ }

func serve(ch chan<- SomeType) { /*do stuff*/ }

func-serve(ch经验法则:箭头显示数据是进入(输出)通道还是离开(输入)通道。没有箭头是通用通道

chan <-          writing to channel (output channel)
<- chan          reading from channel (input channel)
chan             read from or write to channel (input/output channel)

chan回答得不错,只是“end”的正确术语是“direction”/“channeldirection”。请看。规范确实说了“方向”,但这对新手来说并不一定有帮助。对于CSP设计,人们可以粗略地考虑管道之类的流体通道——将其一端倒入,另一端流出。在Occam中,这种区别是明确的,但在Go中是(有意的)更模糊。特别是,使用Go时,可以在单个goroutine中完全使用缓冲通道,因此规范指的是方向而不是终点。这种用法在CSP中不可能实现,但Go的通道实现是灵活的,允许这样做。此外,在考虑r网络可能会死锁。有理论证明,如果有向图是非循环的,那么它是无死锁的。你需要考虑通道的方向来对此进行推理。端点和方向实际上是可互换的-两者都是有用的概念。所有的拥抱都属于smihra!!!
func serve(ch chan interface{}){ //do stuff }
func server(ch *chan interface{}){ //do stuff}
func serve(ch <-chan SomeType) { /*do stuff*/ }

func serve(ch chan<- SomeType) { /*do stuff*/ }
chan <-          writing to channel (output channel)
<- chan          reading from channel (input channel)
chan             read from or write to channel (input/output channel)