"< -chan"之间的区别是什么?和"陈"作为函数返回类型?

时间:2015-08-10 13:04:17

标签: go channel

Golang新手在这里。

之间是否存在功能差异?
func randomNumberGenerator() <-chan int {

func randomNumberGenerator() chan int {

我尝试过使用它们,但它们对我来说似乎很合适。

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

2 个答案:

答案 0 :(得分:36)

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

chan   // read-write
<-chan // read only
chan<- // write only

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

func log(<-chan string) { ...

只有通过签名,您才能知道log函数将使用来自频道的数据,而不会向其发送任何数据。

答案 1 :(得分:11)

这是receive-only channel

的示例
  

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

告诉您的API用户他们应该从该频道接收从不发送,这是很有用的,否则会发生不好的事情。在公共API中指定频道的方向被认为是一种很好的做法。另见:Principles of designing Go APIs with channels