解释这个Go语句

时间:2016-02-17 21:30:43

标签: go

我发现这是在Go书中,并且无法在语言的语法中找到它。有谁能解释一下?它本质上是一个"标签"某种程度?

return (<-reply).(int)

3 个答案:

答案 0 :(得分:10)

在该声明中,您有三件事情是不同的语言功能,它们一起工作。

  • return返回函数
  • 中的值
  • <-reply从名为reply
  • 的频道中读取值
  • var.(type)断言接口包含该类型。

所以把它们放在一起,你从回复通道读取一个接口值,声明该值是一个整数,然后返回该整数值。

答案 1 :(得分:9)

  

The Go Programming Language Specification

     

Receive operator

     

对于通道类型的操作数ch,接收操作的值   &lt; -ch是从信道ch接收的值。渠道方向   必须允许接收操作和接收操作的类型   是通道的元素类型。表达式阻塞直到a   价值可用。从零通道接收永远阻止。一个   在封闭的通道上接收操作总是可以立即进行,   在先前发送之后产生元素类型的零值   价值已经收到。

v1 := <-ch
v2 = <-ch
f(<-ch)
<-strobe  // wait until clock pulse and discard received value
     

用于赋值或初始化的接收表达式   特殊形式

x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch
     

产生一个额外的无类型布尔结果,报告是否   沟通成功了。如果收到的值,则ok的值为true   是通过成功的发送操作传递给频道,或者是假的   如果它是因为通道关闭而生成的零值   空。

     

Type assertions

     

对于接口类型的表达式x和类型T,表示主要的   表达

     

x.(T)

     

断言x不是nil,并且存储在x中的值是T类型。   符号x。(T)称为类型断言。

     

如果类型断言成立,则表达式的值为值   存储在x中,其类型为T.如果类型断言为false,则a   发生运行时恐慌。换句话说,即使是动态类型   x仅在运行时已知,x。(T)的类型已知为a中的T.   正确的计划。

     

Return statements

     

函数F中的“return”语句终止F的执行,   并且可选地提供一个或多个结果值。任何功能   在F返回其调用者之前执行F延迟。

return (<-reply).(int)

<-reply从频道reply收到一个值。

(<-reply).(int)断言从频道reply收到的值属于int类型。

return (<-reply).(int)返回从频道int收到的reply值,并终止该功能或方法。

答案 2 :(得分:0)

return (<-reply).(int)在一个简单示例中:

package main

import "fmt"

func F() int {
    reply := make(chan interface{})
    go func() { reply <- 1 }()
    return (<-reply).(int)
}

func main() {fmt.Println(F())}