【问题标题】:What is the actual type of the variable "t" in a GoLang Type Switch?GoLang 类型开关中变量“t”的实际类型是什么?
【发布时间】:2014-03-22 19:53:26
【问题描述】:

给定:

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... 声明中使用什么类型?这甚至可能吗?

【问题讨论】:

    标签: types go type-switch


    【解决方案1】:

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

    据我所知,您不能使用 var 编写它(而且我知道您只提到了 var 表单作为说明)。

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

    为了回答您的问题,本例中的 t 符号很奇怪且特殊,并且仅在 switch 的上下文中有意义。它的类型取决于上下文。我什至不敢称它为变量。

    编辑,推测:

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

    【讨论】:

    • Go 中的类型切换是奇怪而特殊的事情......我什至不敢称它为变量 从我迄今为止挑选的所有内容来看,看起来:这是一个只能以特定方式使用的特殊构造。
    【解决方案2】:

    在下面一行:

    switch t := im.(type) {
    

    t 已经声明并使用类型的值进行了初始化,因此您不必使用 var t 再次声明它。

    【讨论】:

    • 没有回答问题...我没有问是否有必要。假设我找到了这样声明的用途,问题是 如何 这样做?您是否认为 t 没有类型,除非根据使用 auto: t:= 时收到的值分配类型?即 - 声明和赋值不能分开?
    【解决方案3】:

    很简单,不需要声明。

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

    【讨论】:

    • 查看@Agis 答案的评论 - 这同样适用于您的答案。
    猜你喜欢
    • 2022-11-11
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多