MST
星途 面试题库

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

假设你有一个接口 `Animal` 包含方法 `Speak`,有两个结构体 `Dog` 和 `Cat`,`Dog` 结构体嵌入了 `Animal` 接口的实现结构体 `Mammal`,`Cat` 直接实现 `Animal` 接口。阐述这两种方式在接口实现和使用上的区别,并通过代码展示。
28.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

接口实现和使用上的区别

  1. Dog 结构体通过嵌入 Mammal 实现 Animal 接口
    • 实现方式:通过结构体嵌入,Dog 结构体隐式地获得了 Mammal 实现的 Animal 接口方法。这是一种组合的方式,代码结构上 Dog 结构体依赖于 Mammal 结构体的实现。
    • 使用特点:如果 MammalAnimal 接口方法有更新,Dog 结构体无需额外修改就自动拥有这些更新。但如果 Dog 结构体需要对 Speak 方法有特殊实现,需要在 Dog 结构体中重新定义 Speak 方法来覆盖 Mammal 的实现。
  2. Cat 结构体直接实现 Animal 接口
    • 实现方式Cat 结构体直接定义 Speak 方法,明确地实现 Animal 接口。这种方式更加直接,Cat 结构体对接口实现有完全的控制权。
    • 使用特点Cat 结构体的 Speak 方法实现独立于其他结构体。如果需要修改 CatSpeak 方法,不会影响到其他实现 Animal 接口的结构体。

代码示例(以Go语言为例)

package main

import "fmt"

// Animal 接口
type Animal interface {
    Speak() string
}

// Mammal 结构体实现 Animal 接口
type Mammal struct{}

func (m Mammal) Speak() string {
    return "Generic mammal sound"
}

// Dog 结构体嵌入 Mammal 结构体
type Dog struct {
    Mammal
}

// Cat 结构体直接实现 Animal 接口
type Cat struct{}

func (c Cat) Speak() string {
    return "Meow"
}

func main() {
    var a Animal
    dog := Dog{}
    cat := Cat{}

    a = dog
    fmt.Println(a.Speak())

    a = cat
    fmt.Println(a.Speak())
}

在上述代码中,Dog 通过嵌入 Mammal 间接实现 Animal 接口,Cat 直接实现 Animal 接口。在 main 函数中,可以看到通过接口类型变量 a 调用 Speak 方法时,分别执行了 DogCat 对应的 Speak 方法实现。