MST

星途 面试题库

面试题:Go嵌入式结构体与接口实现的关联

假设有一个接口I,定义了一个方法M。现在有结构体A和B,B嵌入了A。A实现了接口I。请问B是否也自动实现了接口I?如果B想要重写A中实现的接口方法M,应该怎么做?请通过代码示例详细说明。
21.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. B是否自动实现接口I
    • 是的,在Go语言中,如果结构体B嵌入了结构体A,并且A实现了接口I,那么B也自动实现了接口I。因为在Go语言中,接口的实现是隐式的,只要类型提供了接口定义的所有方法,就认为该类型实现了这个接口。由于B嵌入了A,所以B拥有A的方法,也就实现了接口I。
  2. B重写A中实现的接口方法M的方法
    • B可以在自己的结构体中定义与接口I中方法M相同签名的方法,这样就重写了A中实现的方法M。 以下是代码示例:
package main

import "fmt"

// 定义接口I
type I interface {
    M()
}

// 定义结构体A
type A struct{}

// A实现接口I的方法M
func (a A) M() {
    fmt.Println("A's M method")
}

// 定义结构体B,嵌入A
type B struct {
    A
}

// B重写接口I的方法M
func (b B) M() {
    fmt.Println("B's M method")
}

你可以这样使用:

func main() {
    var i I
    a := A{}
    b := B{}

    i = a
    i.M() // 输出: A's M method

    i = b
    i.M() // 输出: B's M method
}

在上述代码中,首先定义了接口I,结构体A实现了接口I的方法M。结构体B嵌入了A,并且B重写了M方法。在main函数中,分别将AB的实例赋值给接口类型I,并调用M方法,观察到调用的是各自对应的M方法。