在 Go 语言中,接口值的动态类型和动态值分别指什么?请解释它们之间的区别,并说明它们是如何影响接口比较的。
考察说明
考查对Go接口底层表示及动态类型与动态值概念的理解。
回答思路
- 【回答框架 1】接口值在内部由两部分组成:动态类型和动态值。动态类型是赋给接口的具体类型,动态值是该类型的实例值。接口值只有在赋值后才具有动态类型和动态值。
- 【回答框架 2】如果接口值为nil,则其动态类型和动态值均为nil。可以通过类型断言或反射来获取动态类型和动态值。
- 【回答框架 3】接口比较时,两个接口值相等当且仅当二者动态类型相同且动态值相等(动态值用==比较)。若动态类型不可比较,则比较会panic。
- 【回答框架 4】动态类型可以是一个接口类型,但动态值必须是具体类型值。由于接口的动态类型信息,可以实现多态。
- 【关键点 1】接口值由动态类型和动态值组成,动态类型决定接口的方法集。
- 【关键点 2】空接口的零值为nil,此时动态类型和动态值均为nil。
- 【关键点 3】接口比较要求动态类型相同且动态值相等,否则不相等。
- 【关键点 4】动态类型不可比较时,接口比较会触发panic。
- 【易错点 1】容易忽略:动态类型为具体类型,动态值可能是nil指针,但接口值不为nil。
- 【易错点 2】比较接口时不检查动态类型,直接比较值可能导致错误。
- 【易错点 3】不要混淆接口的动态类型和静态类型。