Types 变量的实际类型是什么;";在GoLang型开关中?

Types 变量的实际类型是什么;";在GoLang型开关中?,types,go,type-switch,Types,Go,Type Switch,鉴于: 如果我打电话: type MyInterface interface{ MyMethod() int } var im MyInterface ... 声明变量t时,变量的实际类型是什么?为了说明这个问题:如果我想写作 switch t := im.(type) { case:.... default:... } 如何声明t 例如,在Delphi中,我们有以下结构: var t //What type should I use?! 我相信我正在Go

鉴于:

如果我打电话:

type MyInterface interface{

    MyMethod() int

}

var im MyInterface
...
声明变量
t
时,变量的实际类型是什么?为了说明这个问题:如果我想写作

switch t := im.(type) {

   case:....

   default:...

}
如何声明
t

例如,在Delphi中,我们有以下结构:

var t //What type should I use?! 
我相信我正在GoLang寻找类似于
TTypeKind
,具有潜在价值的东西,如
tkInteger
tkString

在C++中,我们找到了<代码> Type信息> /Cux>类,它还提供了一些功能。 在
var t.
声明中,我将使用什么类型的
t
?这可能吗?

在下面一行:

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

t
已经用类型的值声明和初始化,因此您不必使用
var t

再次声明它,它很简单,不需要声明

switch t := im.(type) {
顺便说一句,请不要为接口添加前缀I,这是一种无法使用的风格。通常,您会选择与方法的动词匹配的主语。看


围棋中的类型切换是一种奇怪而特殊的业务。它不是另一种应用于类型的形式的泛化

据我所知,您不能使用
var
编写它(我也知道您只提到
var
表单作为示例)

在开关的
case
子句中,
t
具有在该情况下指定的类型(请参见@Mue)。在
default
子句中,它具有
im
的原始类型

为了回答您的问题,本例中的
t
符号既奇怪又特殊,只有在切换上下文中才有意义。它的类型依赖于上下文。我甚至不敢称之为变量

编辑、推测:


我没有看过编译器,但我怀疑它将每个
case
解构为一个类型断言(cast),其结果是
case
子句范围内的一个局部变量。为了方便语法,您可以使用
t
符号来引用每一项。

没有回答问题。。。我没有问是否有必要。假设我发现了这样声明的用途,问题是怎么做?您的观点是,
t
没有类型,除非根据使用auto:
t:=
时收到的值分配类型?i、 e.-声明和分配不能分开?请参阅@Agis答案上的注释-同样适用于您的答案。Go中的类型切换是怪异和特殊的业务。。。我甚至不愿意把它称为一个变量,从我迄今为止挑选的所有东西来看,它似乎是一个特殊的构造,只能以这种特殊的方式使用。
switch t := anyVar.(type) {
case ThisType:
    // t is of type ThisType
case ThatType:
    // t is of type ThatType
default:
    // t has its original type.
}
type Writer interface {
    Write([]byte) (int, error)
}