GoLang类型开关中变量“t”的实际类型是什么?

GoLang类型开关中变量“t”的实际类型是什么?

问题描述:

考虑:GoLang类型开关中变量“t”的实际类型是什么?

type MyInterface interface{ 

    MyMethod() int 

} 

var im MyInterface 
... 

如果我称之为:

switch t := im.(type) { 

    case:.... 

    default:... 

} 

什么是实际类型变量t当它被宣布?为了说明这个问题:如果我想写

var t //What type should I use?! 

我该如何声明t

例如在Delphi中,我们有这样的结构:

TTypeInfo = record 
    Kind: TTypeKind; 
    Name: string; 
    {TypeData: TTypeData} 
end; 

我相信我寻找GoLang东西是类似于TTypeKind,其中有诸如tkInteger潜在价值,tkString

在C++中,我们找到type_info类的类型,它也提供了这些功能。

声明中我将使用什么类型的t?这甚至有可能吗?

Go中的类型开关是奇怪而特殊的业务。这不是泛泛应用于类型的另一种形式。

据我所知,你不能用var来写它(我承认你只提到了var表格)。

在开关的case子句,t具有在这种情况下指定的类型(见@ MUE的answer)。在default子句中,它有im的原始类型。

要回答你的问题,在这种情况下,t符号是奇怪和特殊的,只在交换机的上下文中有意义。它的类型是依赖于上下文的。我犹豫甚至称它为变量。

编辑猜测:

我没有看过的编译器,但我怀疑它解构每个case成式断言(投),其结果是case条款的范围内的局部变量。作为句法的便利,您可以使用t符号来引用每个符号。

+0

_ Go中的类型开关是奇怪而特殊的事务...我甚至不愿将它称为变量_从我迄今为止所剔除的所有内容开始,所以它显示出来:它是一种特殊的构造,只能以特定的方式使用。 – Vector

在下面一行:

switch t := im.(type) { 

t已经宣布&与该类型的值进行初始化,所以你不必使用var t再次声明。

+0

没有回答这个问题......如果有必要,我没问**。假设我发现了一种用于这种声明的用法,问题是**如何做到这一点?你的观点是't'除了使用auto时根据它接收到的值分配一个类型时没有类型:'t:='?即 - 声明和分配**不能**分开? – Vector

+0

@ComeAndGo是的,这是我的观点。 – Agis

它很简单,不需要声明。

switch t := anyVar.(type) { 
case ThisType: 
    // t is of type ThisType 
case ThatType: 
    // t is of type ThatType 
default: 
    // t has its original type. 
} 

而顺便说一句,请不要前缀我的界面,这是没有Go风格。通常,您会选择与方法动词相匹配的主题。请参阅

type Writer interface { 
    Write([]byte) (int, error) 
} 
+0

查看关于@ Agis的答案的评论 - 同样适用于您的答案。 – Vector