Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In golang, is it possible to get reflect.Type from the type itself, from name as string?

type t1 struct { i int; s string } var v1 reflect.Type = /* how to set to t1's reflect.Type? */ 
  1. is it possible to get the reflect.Type of t1 without having to instantiate it?

  2. is it possible to get the reflect.Type of t1 from having its name "t1" as a string?

like image 852
cc young Avatar asked Jun 17 '11 19:06

cc young


People also ask

How do you reflect type in Golang?

TypeOf() Function in Golang is used to get the reflection Type that represents the dynamic type of i. To access this function, one needs to imports the reflect package in the program. Parameters: This function takes only one parameters of interface( i ). Return Value: This function returns the reflection Type.

How does Golang reflection work?

Every type in golang, including user-defined type, itself has the information about type name, fields name and the function name. Golang reflection just reads these information or call the function. Through some mechanism, Golang can get the type name, storage size and so on.

How do I print type in Go?

🤔 Print type of variable in Go To print a variable's type, you can use the %T verb in the fmt. Printf() function format. It's the simplest and most recommended way of printing type of a variable. Alternatively, you can use the TypeOf() function from the reflection package reflect .


1 Answers

On 1, yes, kinda:

var v1 reflect.Type = reflect.TypeOf((*t1)(nil)).Elem() fmt.Println(v1)  // prints "main.t1" 

No instantiation needed. However, Go doesn't have type literals, which is I think what you're asking for. To get the runtime value of a type, you need to have a value of some sort. If you don't want to or can't create the value at runtime, you can pull it from a typed nil. If you don't like the idea of looking this up every time, you can store this runtime type in a variable.

On 2, no, not really. This would require the Go runtime to maintain a map of all types in the current binary, which has a number of problems. You could create a type registry package, and register all types you may want to retrieve by string, but that's always going to be incomplete, and if you know what type you want, you can always just use TypeOf. The situation is made a bit more complicated by the fact that you can have anonymous types, and the name like "t1" isn't certain to be unique, as another package may have a type of the same name. It is possible for the Go runtime to provide a function that gives a type from a string name, but I doubt that will happen.

like image 77
Kyle C Avatar answered Oct 04 '22 22:10

Kyle C