"<-chan"和"chan"作为函数返回类型有什么区别?

Abh*_*k S 29 channel go

Golang新手在这里.

两者之间是否存在功能差异?

func randomNumberGenerator() <-chan int {
Run Code Online (Sandbox Code Playgroud)

func randomNumberGenerator() chan int {
Run Code Online (Sandbox Code Playgroud)

我尝试过使用它们,它们似乎对我很好.

我已经看过Rob Pike(Go创建者之一)在Google IO 2012的Go Concurrency Patterns演讲中使用的前者.我也看到它在Go的官方网站上使用过.为什么可以省略它时添加2个额外字符("< - ")?我已经尝试在网上寻找差异,但找不到它.

Mat*_*don 40

两者都会奏效.但是人们会更加限制.箭头指向远离chan关键字的表单意味着返回的通道只能通过客户端代码拉出.不允许推送:推送将由随机数生成器功能完成.相反,有第三种形式,箭头指向chan,这使得所述通道只写给客户端.

chan   // read-write
<-chan // read only
chan<- // write only
Run Code Online (Sandbox Code Playgroud)

这些添加的约束可以改善意图的表达并收紧类型系统:尝试强制进入只读通道将导致编译错误,因此将尝试从只写通道读取.这些约束可以在返回类型中表示,但它们也可以是参数签名的一部分.像 :

func log(<-chan string) { ...
Run Code Online (Sandbox Code Playgroud)

只需通过签名,您就可以知道该log函数将使用来自通道的数据,而不会向其发送任何数据.


Ain*_*r-G 11

这是仅接收频道的示例.

可选<-运算符指定通道方向,发送或接收.如果没有给出方向,则通道是双向的.频道可能仅限于发送或仅通过转换或分配来接收.

告诉API的用户他们应该从该频道收到并且从不发送,这是有用的,否则会发生不好的事情.在公共API中指定频道的方向被认为是一种很好的做法.另请参阅:使用渠道设计Go API的原则.

  • 这不仅仅是"用户永远不应该发送其他不好的事情".试图发送的AFAIK只会让编译器直截了当地生气. (5认同)