MST

星途 面试题库

面试题:Go组合方法集在复杂场景下的表现

假设有一个嵌套多层的结构体组合关系,例如A结构体组合B结构体,B结构体又组合C结构体,且每个结构体都有各自的方法集。请阐述在调用不同层级结构体方法时,方法集的查找和调用规则,同时说明如果方法名冲突时如何解决?
28.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

方法集查找和调用规则

  1. 直接组合结构体的方法调用
    • 当调用 A 结构体实例的方法时,首先会在 A 结构体自身的方法集中查找。如果找到了对应的方法,就直接调用该方法。
    • 例如,A 结构体有一个方法 aMethod,对于 A 类型的实例 a,调用 a.aMethod() 时,会直接执行 A 结构体定义的 aMethod 方法。
  2. 嵌套结构体的方法调用
    • 如果在 A 结构体自身方法集中未找到方法,会沿着结构体组合关系查找。例如 A 组合了 B,会在 B 结构体的方法集中查找。
    • 比如 B 结构体有一个方法 bMethodA 结构体实例 a 可以通过 a.B.bMethod() 来调用 B 结构体的 bMethod 方法。
    • 如果 B 又组合了 C,当在 AB 结构体方法集中都未找到方法时,会继续在 C 结构体的方法集中查找。例如 C 结构体有 cMethod,可以通过 a.B.C.cMethod() 调用。

方法名冲突解决

  1. 同层级冲突
    • 如果在同一层级的结构体(如 AB 处于同一组合层级)中出现方法名冲突,编译器会报错。因为无法明确调用哪个方法。
    • 解决方法是修改其中一个方法名,使其具有唯一性。例如将 A 结构体中的冲突方法名 conflictMethod 修改为 aConflictMethodB 结构体中的冲突方法名 conflictMethod 修改为 bConflictMethod
  2. 不同层级冲突
    • 当不同层级的结构体出现方法名冲突时,例如 A 结构体和 B 结构体都有 sameMethod 方法。调用 a.sameMethod() 时,会调用 A 结构体自身的 sameMethod 方法,因为查找是从当前结构体开始,沿着组合关系向外查找,优先调用最近层级的方法。
    • 如果想调用 B 结构体的 sameMethod 方法,需要通过明确指定路径,如 a.B.sameMethod()