为什么要反思.类型(新(编码器)).Elem()!=反映类型(接口变量)



下面是简短的测试:

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

输出false

为什么是false?我原以为是true

来自反射。文件类型:

TypeOf返回表示的动态类型的反射类型i.如果i是nil接口值,TypeOf将返回nil

因此:

var en Encoder // nil interface value
encoderInterface2 := reflect.TypeOf(en) // <- nil

关于:

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

将其分解为两部分:

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

因此:

encoderInterface1 != encoderInterface2

因为:

encoderInterface1 != nil

最新更新