Search code examples
typesgotype-switch

What is the actual type of the variable "t" in a GoLang Type Switch?


Given:

type MyInterface interface{

    MyMethod() int

}

var im MyInterface
...

If I call:

switch t := im.(type) {

   case:....

   default:...

}

What is the actual type of the variable t when it is declared? To illustrate the question: If I wanted to write

var t //What type should I use?! 

How would I declare t ?

For example In Delphi we have this structure:

TTypeInfo = record
  Kind: TTypeKind;
  Name: string;
  {TypeData: TTypeData}
end;

I believe I am looking for something in GoLang that is akin to TTypeKind, which has potential values such as tkInteger, tkString etc.

In C++, we find the type_info class type, which also provides some of this functionality.

What type would I use for t in the var t... declaration? Is this even possible?


Solution

  • The type switch in Go is weird and special business. It’s not a generalization of another form that happens to be applied to types.

    To my knowledge, you can’t write it using var (and I do recognize that you only mention the var form as illustration).

    Within a case clause of the switch, t has the type specified in that case (see @Mue’s answer). Inside the default clause, it has im’s original type.

    To answer your question, the t symbol in this case is weird and special, and only meaningful in the context of the switch. Its type is context-dependent. I hesitate to even call it a variable.

    Edit, speculation:

    I haven’t looked at the compiler but I suspect it deconstructs each case into a type assertion (cast), the result of which is a local variable within the scope of the case clause. As a syntactic convenience, you can refer to each using the t symbol.