我发现这是在Go书中,并且无法在语言的语法中找到它。有谁能解释一下?它本质上是一个"标签"某种程度?
return (<-reply).(int)
答案 0 :(得分:10)
在该声明中,您有三件事情是不同的语言功能,它们一起工作。
return
返回函数<-reply
从名为reply var.(type)
断言接口包含该类型。所以把它们放在一起,你从回复通道读取一个接口值,声明该值是一个整数,然后返回该整数值。
答案 1 :(得分:9)
The Go Programming Language Specification
对于通道类型的操作数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 是通过成功的发送操作传递给频道,或者是假的 如果它是因为通道关闭而生成的零值 空。
对于接口类型的表达式x和类型T,表示主要的 表达
x.(T)
断言x不是nil,并且存储在x中的值是T类型。 符号x。(T)称为类型断言。
如果类型断言成立,则表达式的值为值 存储在x中,其类型为T.如果类型断言为false,则a 发生运行时恐慌。换句话说,即使是动态类型 x仅在运行时已知,x。(T)的类型已知为a中的T. 正确的计划。
函数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())}