英文:
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) // <- 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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论