GoLang型交换机中变量“t”的实际类型是什么?

时间:2014-02-21 10:40:54

标签: types go type-switch

假设:

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,它具有潜在价值,例如tkIntegertkString等。

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

我会在t声明中对var t...使用哪种类型的广告?这甚至可能吗?

3 个答案:

答案 0 :(得分:4)

Go中的类型切换是奇怪而特殊的业务。这并不是碰巧应用于类型的另一种形式的概括。

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

在交换机的case子句中,t在此案例中指定了类型(请参阅@ Mue的answer)。在default子句中,它具有im的原始类型。

要回答您的问题,在这种情况下,t符号是奇怪且特殊的,并且仅在切换的上下文中有意义。它的类型取决于上下文。我甚至不称它为变量。

编辑,推测:

我没有查看编译器,但我怀疑它将每个case解构为类型断言(强制转换),其结果是case子句范围内的局部变量。为方便起见,您可以使用t符号来引用每个符号。

答案 1 :(得分:3)

在以下行中:

switch t := im.(type) {

t已经宣布&使用类型的值初始化,因此您不必使用var t再次声明它。

答案 2 :(得分:2)

这很简单,不需要声明。

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)
}