转换类型别名的类型开关

时间:2017-05-05 20:50:43

标签: go types casting

对此的答案可能非常明显,但无论如何我都在问,因为我没有找到一个很好的解释。

我有两个例子,他们做了几乎相同的事情,但是,第一个使用int,另一个使用接口:

界面:https://play.golang.org/p/yb2oVaOJGF
Int:https://play.golang.org/p/_z8Mm0II41

有人可以解释为什么他们会产生不同的输出吗?

3 个答案:

答案 0 :(得分:1)

如果将Apple和Orange定义为interface{},则实现该接口的任何内容都会满足类型开关。

对于空接口,即任何内容,并且第一种情况匹配。

当Apple和Orange是"别名"对于非接口类型(int),只有显式为Apple或Orange的变量才能满足类型切换。

答案 1 :(得分:1)

因为您将Apple和Orange类型定义为空接口,所以它们都满足。

空接口本质上没什么特别的。

第一个示例中的所有内容都可以作为int类型声明为Apple或Oranges。

看看你的第一个示例代码的这个小改动。

https://play.golang.org/p/LDtvbXnjT7

答案 2 :(得分:0)

由于您说的其他答案不直观,因此我尝试从完全不同的角度来解释它。您提到的案例与您的类型别名无关,与与Go中接口的工作方式无关。为了更清楚地显示您提供的两个代码之间的区别,这里有一个不同的代码,它提供的输出与您的界面示例相似,但是根本不使用类型别名。

游乐场链接:https://play.golang.org/p/0tyDV28cp2b

var identity = (ClaimsIdentity)User.Identity;
IEnumerable<Claim> claims = identity.Claims;