假设:
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
声明中对var t...
使用哪种类型的广告?这甚至可能吗?
答案 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)
}