concurrency - 在函数中将 channel 作为参数传递的不同方法

标签 concurrency go channel

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

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}

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

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

最佳答案

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

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

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

通过包含箭头 <-chanchan<- ,你正在实现三件事:

  • 您明确表示该参数是 channel 的一个结束
  • 您清楚地表达了提供了哪个端。 chan<-是发送(写入)端。 <-chan是接收(读取)端。
  • 您正在向编译器提供更多信息以供检查。如果函数体尝试使用错误的 channel 末端,编译器可能会引发错误。

这些都是尽可能显示 channel 结束的好理由。

您的第三种情况描述指定 channel 的结束。这允许访问 channel 的两端,这在某些情况下是正确的,但在其他情况下可能会导致意外错误。

第四种情况,传递一个指向 channel 的指针,是很不寻常的,也许有点奇怪。如果您想更改 channel ,将其作为返回参数包含在内会更清楚。

关于concurrency - 在函数中将 channel 作为参数传递的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24868859/

相关文章:

Java ExecutionrCompletionService take.get() 从不同的线程

html - golang 资源解释为样式表但以 MIME 类型 text/plain 传输

go - 使用 channel 进行请求-响应通信的惯用方式

java - Netty:发送消息时出现问题

go - 选择和上下文。上下文完成 channel

go - 如何在 go 中修复并发合并排序

java - Android 线程安全的 SharedPreferences

java - 构造函数中的两个 "volatile"变量是否遵循Happens-before关系?

go - 返回值指针语法

go - 如何在proto文件中导入和使用protobuf timestamppb包?