对此的答案可能非常明显,但无论如何我都在问,因为我没有找到一个很好的解释。
我有两个例子,他们做了几乎相同的事情,但是,第一个使用int,另一个使用接口:
界面:https://play.golang.org/p/yb2oVaOJGF
Int:https://play.golang.org/p/_z8Mm0II41
有人可以解释为什么他们会产生不同的输出吗?
答案 0 :(得分:1)
如果将Apple和Orange定义为interface{}
,则实现该接口的任何内容都会满足类型开关。
对于空接口,即任何内容,并且第一种情况匹配。
当Apple和Orange是"别名"对于非接口类型(int),只有显式为Apple或Orange的变量才能满足类型切换。
答案 1 :(得分:1)
因为您将Apple和Orange类型定义为空接口,所以它们都满足。
空接口本质上没什么特别的。
第一个示例中的所有内容都可以作为int类型声明为Apple或Oranges。
看看你的第一个示例代码的这个小改动。
答案 2 :(得分:0)
由于您说的其他答案不直观,因此我尝试从完全不同的角度来解释它。您提到的案例与您的类型别名无关,与与Go中接口的工作方式无关。为了更清楚地显示您提供的两个代码之间的区别,这里有一个不同的代码,它提供的输出与您的界面示例相似,但是根本不使用类型别名。
游乐场链接:https://play.golang.org/p/0tyDV28cp2b
var identity = (ClaimsIdentity)User.Identity;
IEnumerable<Claim> claims = identity.Claims;