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
符号来引用每个符号。
它很简单,不需要声明。
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)
}
查看关于@ Agis的答案的评论 - 同样适用于您的答案。 – Vector
_ Go中的类型开关是奇怪而特殊的事务...我甚至不愿将它称为变量_从我迄今为止所剔除的所有内容开始,所以它显示出来:它是一种特殊的构造,只能以特定的方式使用。 – Vector