为什么 `reflect.TypeOf(new(Encoder)).Elem()` 不等于 `reflect.TypeOf(interfaceVariable)`?

huangapple go评论81阅读模式
英文:

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

问题

这是一个简短的测试:

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

英文:

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.

答案1

得分: 1

reflect.TypeOf文档中可以得知:

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

因此:

var en Encoder // nil接口值

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

至于:

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

将其分为两部分:

pi := reflect.TypeOf(new(Encoder)) // <- 这是一个指向接口的指针(因此不是nil)
encoderInterface1 := pi.Elem()

所以:

encoderInterface1 != encoderInterface2

因为:

encoderInterface1 != nil
英文:

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) // &lt;- nil

As for:

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

breaking this into two parts:

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

So:

encoderInterface1 != encoderInterface2

because:

encoderInterface1 != nil

huangapple
  • 本文由 发表于 2022年10月15日 09:33:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/74076081.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定