在 Go 语言中,两个类型为 interface 的变量之间能否使用 == 运算符进行比较?如果可以,比较的规则是什么?
考察说明
考查对 Go 语言 interface 底层结构及可比较性的理解。
回答思路
- 【回答框架 1】interface 由类型和值两部分组成。两个 interface 变量可以用 == 比较,但前提是两者的动态类型相同且该类型是可比较类型。
- 【回答框架 2】比较规则:先比较动态类型,类型不同则直接不相等;类型相同再比较动态值。如果动态类型是不可比较类型(如 slice、map、func),则运行时比较会引发 panic。
- 【回答框架 3】interface 与 nil 比较:只有当动态类型和动态值都为 nil 时,interface 才等于 nil。注意一个非 nil 的 interface 变量内部可能持有 nil 指针,此时它不等于 nil。
- 【回答框架 4】两个 interface 变量比较时,如果动态类型是结构体等复合类型,会递归比较其字段,且所有字段必须可比较。
- 【关键点 1】interface 比较要求动态类型相同且动态值可比较。
- 【关键点 2】动态类型不可比较时,比较操作会 panic。
- 【关键点 3】一个持有 nil 指针的 interface 不等于 nil。