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

新手上路,请多包涵

我正在阅读一些 go 代码并说了几种不同的方式来传递 go 通道。也许它们是相同的,但我想知道是否有任何区别,因为我无法在网上找到文档:

1)

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

2)

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

3)

 func serve(ch chan interface{}){ //do stuff }

4)

 func server(ch *chan interface{}){ //do stuff}

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

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

原文由 Charlie Parker 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 730
2 个回答

这些是不同 类型 的渠道。请参阅 http://golang.org/ref/spec#Channel_types 。对于指针的东西:不常见,但如果您想从函数内部更改通道(在野外从未见过),可能会有用。

原文由 Volker 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

通过包含箭头 <-chanchan<- ,您将实现三件事:

  • 您明确表示参数是通道的 一端
  • 您清楚地表达了供应的是 哪一 端。 chan<- 是发送(写)端。 <-chan 是接收(读)端。
  • 您正在向编译器提供更多信息以供检查。如果函数体试图使用错误的通道末端,编译器会报错。

这些都是尽可能显示频道结束的充分理由。

您的第三个案例描述了 指定频道的结尾。这允许访问通道的两端,这在某些情况下是正确的,但在其他情况下可能会导致意外错误。

第四种情况,将指针传递给通道,非常不寻常,也许有点奇怪。如果您想更改频道,将它作为返回参数包含在内会更清楚。

原文由 Rick-777 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题