MST
星途 面试题库

面试题:Go语言接口的嵌入与接口方法集在多态实现中的复杂性

在Go语言中,有一个基础接口`BaseInterface`定义了方法`BaseMethod`。现有两个接口`InterfaceA`和`InterfaceB`,它们都嵌入了`BaseInterface`。同时,有一个结构体`MyStruct`实现了`InterfaceA`的所有方法。请说明`MyStruct`是否也隐式实现了`InterfaceB`?如果是,为什么?如果不是,怎样修改代码能让`MyStruct`实现`InterfaceB`?并且阐述在这种接口嵌入与多态实现过程中,Go语言编译器是如何处理方法集查找的。
32.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. MyStruct是否隐式实现了InterfaceB
    • MyStruct并没有隐式实现InterfaceB。虽然InterfaceAInterfaceB都嵌入了BaseInterface,且MyStruct实现了InterfaceA的所有方法,但接口的实现要求严格匹配。InterfaceAInterfaceB是不同的接口类型,仅仅因为MyStruct实现了InterfaceA,并不意味着它自动实现了InterfaceB
  2. 怎样修改代码能让MyStruct实现InterfaceB
    • 由于InterfaceB嵌入了BaseInterface,而MyStruct已经实现了BaseInterfaceBaseMethod(通过实现InterfaceA间接实现),所以要让MyStruct实现InterfaceB,只需要让MyStruct实现InterfaceB特有的方法(如果有的话)。如果InterfaceB除了嵌入的BaseInterface的方法外没有其他方法,那么不需要额外编写方法,直接声明MyStruct实现InterfaceB即可,如下代码示例:
package main

import "fmt"

// BaseInterface 定义基础接口
type BaseInterface interface {
    BaseMethod()
}

// InterfaceA 嵌入BaseInterface
type InterfaceA interface {
    BaseInterface
    // 假设InterfaceA有其他方法
    MethodA()
}

// InterfaceB 嵌入BaseInterface
type InterfaceB interface {
    BaseInterface
    // 假设InterfaceB有其他方法
    MethodB()
}

// MyStruct 结构体
type MyStruct struct{}

// BaseMethod 实现BaseInterface的BaseMethod
func (m MyStruct) BaseMethod() {
    fmt.Println("BaseMethod implementation")
}

// MethodA 实现InterfaceA的MethodA
func (m MyStruct) MethodA() {
    fmt.Println("MethodA implementation")
}

// MethodB 实现InterfaceB的MethodB
func (m MyStruct) MethodB() {
    fmt.Println("MethodB implementation")
}
  • 这样MyStruct就实现了InterfaceB
  1. Go语言编译器如何处理方法集查找
    • 当一个接口类型被嵌入到另一个接口中时,外层接口继承了嵌入接口的所有方法。例如InterfaceAInterfaceB都继承了BaseInterfaceBaseMethod
    • 对于结构体类型,编译器在判断一个结构体是否实现了某个接口时,会检查结构体是否实现了该接口的所有方法。对于像MyStruct这样的结构体,编译器会遍历InterfaceA(或InterfaceB)的方法列表,逐一检查MyStruct是否有对应的方法实现。
    • 在方法调用时,编译器首先确定接收者的类型(如MyStruct),然后根据接收者的类型查找其方法集。如果方法集包含接口要求的所有方法,则认为该结构体实现了此接口。对于嵌入接口的情况,编译器会递归地检查嵌入接口的方法是否在结构体的方法集中,从而确定结构体是否实现了包含嵌入接口的复杂接口。