Cha*_*ker 45 concurrency channel go
我正在阅读一些代码并说几种不同的方式来传递频道.也许他们是一样的,但我想知道是否有任何差异,因为我在网上找不到文件:
1)
func serve(ch <-chan interface{}){ //do stuff }
Run Code Online (Sandbox Code Playgroud)
2)
func serve(ch chan<- interface{}){ //do stuff }
Run Code Online (Sandbox Code Playgroud)
3)
func serve(ch chan interface{}){ //do stuff }
Run Code Online (Sandbox Code Playgroud)
4)
func server(ch *chan interface{}){ //do stuff}
Run Code Online (Sandbox Code Playgroud)
我想知道它们之间有什么区别,如果它们只是等同的方式来做同样的事情:在不同的goroutines周围传递一个通道.
注意:我知道没有理由将指针传递给chan,map或slice或函数值,因为这些都是内部包含指针的引用类型(如果您希望被调用者更改,则会出现异常引用类型标题).我提供它的唯一原因是为了完整性(即真正提供可以尝试将通道作为参数传递的每种方式,并且有希望地提出问题,引用所有方法来进行此操作并对它们进行比较).
Ric*_*777 57
我总是建议在任何可能的地方传递方向,例如
func serve(ch <-chan SomeType) { /*do stuff*/ }
func serve(ch chan<- SomeType) { /*do stuff*/ }
Run Code Online (Sandbox Code Playgroud)
通过包含箭头<-chan或chan<-,您实现了三件事:
这些是尽可能显示频道结束的充分理由.
您的第三种情况描述未指定频道的结尾.这允许访问通道的两端,这在某些情况下是正确的,但在其他情况下可能导致意外错误.
第四种情况,将指针传递给通道,这是非常不寻常的,也许有点奇怪.如果您想更改频道,则将其作为返回参数包含在内会更加清晰.
Vol*_*ker 25
这些是不同类型的渠道.请参阅http://golang.org/ref/spec#Channel_types.对于指针的东西:不常见,但如果你想从函数内部更改通道可能会很有用(从未在野外看到过).
smi*_*hra 22
经验法则:箭头显示数据是进入(输出)还是离开(输入)通道.没有箭头是通用渠道.
chan <- writing to channel (output channel)
<- chan reading from channel (input channel)
chan read from or write to channel (input/output channel)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35581 次 |
| 最近记录: |