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