Go Reflect: Correctly Get an Empty Interface Type¶
This blog records the tricky part of using reflect to get an empty interface type correctly. The background is that a component requires the configuration type during function call as it might use the type to construct a type and set up the value based on some external data set. If we cannot find a respective in some scenarios, empty interface type should be passed.
However, at the beginning due to the wrong usage of reflect, a nil type instead of interface{} type is passed by reflect.TypeOf(i).
var i interface{}
// this is correct
typ := reflect.TypeOf(&i).Elem()
// this is wrong usage, the typ is nil
typ := reflect.TypeOf(i)
What's the Issue?¶
The code below prints nil and interface{} for the code below.
The explanation is that the declaration var i interface defines an interface with a nil underlying type.
Hence, the reflect.TypeOf(i) indeed returns the type of the underlying type, which is nil. To get the empty interface, we need to pass the pointer &i into reflect.TypeOf, so the interface received by TypeOf is:
The TypeOf(&i) gets the *interface{nil}, and Elem de-references the pointer and returns the interface{nil}.