2017-10-10 122 views
2

转到福利局在这里 - 我遇到的Go代码如下位,我没写GoLang:包含在括号内的属性的语义意义?

if tc, ok := tng.(ThingClasser); ok { 
    //... do some stuff ... 
} 

我不明白的tng.(ThingClasser)语义。

在某些方面,这看起来像一个方法调用 - 即有两个变量(ec,ok)坐在那里准备接受多个返回值。

但是,tng.(ThingClasser)本身看起来像它的一个属性访问,而不是方法调用。

然而,ThingClasser左右的皱纹是我以前从未见过的皱纹。另外,如果它很重要,ThingClasser符号在这个项目的其他地方定义为一个接口,所以我认为这可能是一些附近的语法糖,它实现了一个接口 - 但后来这两个返回值让我困惑。

谷歌搜索还没有发现任何具体的东西,但这是谷歌难以接受的事情之一。

有没有人知道GoLang中这个调用/语法是什么,并且有可能在相关的手册页面指向我,这样我可以RTFM?

+2

[Go language spec](https://golang.org/ref/spec)相对简单。这是检查这些事情的最佳地点。搜索'。(''快速找到“类型断言”规范 – JimB

回答

3

这是一个类型断言。返回的值是1)转换为给定类型的对象;和2)指示转换是否成功的布尔值。 ThingClasser是被转换为的类型。文档可以在这里找到:https://golang.org/ref/spec#Type_assertions

+2

作为一个侧面说明,Go规范值得一读,与大多数现代语言不同,它很短 - 非常短,是C#规范的1/5大小, Java规格的十分之一大小。由于Go的简单性,您可以在几个小时内阅读完整的原始语言规范,并从中获益匪浅。 – Adrian