2

鉴于:

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类类型,它也提供了一些这种功能。

我将tvar t...声明中使用什么类型?这甚至可能吗?

4

3 回答 3

4

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

据我所知,你不能用它来写它var(我承认你只提到var表格作为插图)。

在 switch 的一个case子句中,t具有在这种情况下指定的类型(请参阅@Mue 的答案)。在default子句内部,它具有im' 原始类型。

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

编辑,推测:

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

于 2014-02-21T19:34:39.070 回答
3

在以下行中:

switch t := im.(type) {

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

于 2014-02-21T11:11:19.820 回答
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.
}

顺便说一句,请不要给接口加上前缀 I,那不是 Go 风格。通常,您选择与方法的动词匹配的主题。看

type Writer interface {
    Write([]byte) (int, error)
}
于 2014-02-21T12:13:03.653 回答