Home > Mobile >  why reflect.TypeOf(new(Encoder)).Elem() != reflect.TypeOf(interfaceVariable)?
why reflect.TypeOf(new(Encoder)).Elem() != reflect.TypeOf(interfaceVariable)?

Time:10-15

Here's the short test:

type Encoder interface {
    Encode()
}
func main() {
    encoderInterface1 := reflect.TypeOf(new(Encoder)).Elem()
    var en Encoder
    encoderInterface2 := reflect.TypeOf(en)
    fmt.Println(encoderInterface1 == encoderInterface2)
}

Outputs false.

Why is it false? I was expecting it to be true.

CodePudding user response:

From the reflect.TypeOf docs:

TypeOf returns the reflection Type that represents the dynamic type of i. If i is a nil interface value, TypeOf returns nil.

Therefore:

var en Encoder // nil interface value

encoderInterface2 := reflect.TypeOf(en) // <- nil

As for:

encoderInterface1 := reflect.TypeOf(new(Encoder)).Elem()

breaking this into two parts:

pi := reflect.TypeOf(new(Encoder)) // <- this is a pointer to an interface (so not nil)
encoderInterface1 := pi.Elem()

So:

encoderInterface1 != encoderInterface2

because:

encoderInterface1 != nil
  • Related