<-
操作符在Go语言中是什么意思?在许多与Go相关的代码片段中看到过,但它的含义是什么?
你已经得到了答案,但是这里还有一些解释。
把一个channel视为一条消息队列。
如果该channel在左箭头(<-)操作符的右侧,那么它表示出列一个条目。将此条目保存在变量中是可选的。
e <- q
如果通道在左箭头运算符的左侧,就意味着将一个条目入队。q <- e
关于“dequeue”(接收)而不将其存储在变量中的进一步说明:它可以用于非缓冲队列,以实现类似Java中“等待/通知”操作的功能:一个协程被阻塞等待出列/接收信号,然后另一个协程将发送该信号,其内容并不重要。(或者,发送方可以被阻塞,直到接收方拉出消息)
<-
在语言规范中被多次使用:
通道类型:
<-
运算符指定通道的方向,发送或接收。如果未给出方向,则通道是双向的。通过转换或分配,可以将通道限制为仅发送或仅接收。对于通道类型的操作数
ch
,接收操作<-ch
的值是从通道ch
接收到的值。值的类型是通道的元素类型。该表达式会一直阻塞,直到有一个值可用。从空通道中接收将一直阻塞。从关闭的通道中接收总是成功的,并立即返回元素类型的零值。发送语句:
发送语句在通道上发送一个值。通道表达式必须是通道类型,值的类型必须可以赋值给通道的元素类型。
SendStmt = Channel "<-" Expression .
Channel = Expression .
接收操作符也是 select 语句 的基本组成部分。
对于一个通道类型的操作数
ch
,接收操作<-ch
的值是从通道ch
中接收到的值。
它从通道中接收一个值。请参见http://golang.org/ref/spec#Receive_operator