Golang中的“小于后跟破折号”(<-)运算符是什么?

41

<- 操作符在Go语言中是什么意思?在许多与Go相关的代码片段中看到过,但它的含义是什么?

3个回答

30

你已经得到了答案,但是这里还有一些解释。

把一个channel视为一条消息队列。

如果该channel在左箭头(<-)操作符的右侧,那么它表示出列一个条目。将此条目保存在变量中是可选的。

e <- q
如果通道在左箭头运算符的左侧,就意味着将一个条目入队。
q <- e

关于“dequeue”(接收)而不将其存储在变量中的进一步说明:它可以用于非缓冲队列,以实现类似Java中“等待/通知”操作的功能:一个协程被阻塞等待出列/接收信号,然后另一个协程将发送该信号,其内容并不重要。(或者,发送方可以被阻塞,直到接收方拉出消息)


18

<-在语言规范中被多次使用:

通道类型

<-运算符指定通道的方向,发送或接收。如果未给出方向,则通道是双向的。通过转换或分配,可以将通道限制为仅发送或仅接收。

接收操作符

对于通道类型的操作数ch,接收操作<-ch的值是从通道ch接收到的值。值的类型是通道的元素类型。该表达式会一直阻塞,直到有一个值可用。从空通道中接收将一直阻塞。从关闭的通道中接收总是成功的,并立即返回元素类型的零值。

发送语句

发送语句在通道上发送一个值。通道表达式必须是通道类型,值的类型必须可以赋值给通道的元素类型。

SendStmt = Channel "<-" Expression .
Channel  = Expression .

接收操作符也是 select 语句 的基本组成部分。


箭头给出了数据流的方向提示。个人而言,我更喜欢Occam-Pi语法中使用?表示输入,而不是<-ch(?表示查询通道),并使用!表示输出,而不是ch<-(!表示命令通道)。 - Rick-777
1
我想知道为什么箭头总是指向左边。为什么他们不使用<-和->? - marcus
1
如果左侧为空怎么办?例如:case <-ticker.C: - tolga

3

4
Stack Overflow需要的不仅仅是一个链接。我已经替你修复了它。 - peterSO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接