MST

星途 面试题库

面试题:Go语言接口演化时如何确保简单类型兼容性

假设在Go语言项目中,初始定义了一个接口 `Animal` 仅有一个方法 `Speak`。后续项目演进,在 `Animal` 接口添加了一个新方法 `Run`。对于已经实现了旧 `Animal` 接口的类型,如 `Dog` 结构体,要使其兼容新接口,在不破坏原有代码调用的前提下,应该怎么做?
45.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 方法一:直接实现新方法Dog 结构体对应的代码中,直接添加对新 Run 方法的实现。
type Dog struct {
    // 结构体字段
}

func (d Dog) Speak() {
    // 原有 Speak 方法实现
}

func (d Dog) Run() {
    // Run 方法的具体实现,例如:
    println("Dog is running")
}

这样,Dog 结构体就既满足了旧接口的 Speak 方法,也满足了新接口的 Run 方法,并且原有调用 Speak 方法的代码不会受到破坏。

  1. 方法二:使用组合(如果适用场景允许) 可以创建一个新的结构体,通过组合旧的实现 Animal 接口的结构体,并实现新方法。
type Dog struct {
    // 结构体字段
}

func (d Dog) Speak() {
    // 原有 Speak 方法实现
}

// 新的包装结构体
type NewDog struct {
    Dog
}

func (nd NewDog) Run() {
    // Run 方法的具体实现,例如:
    println("NewDog is running")
}

在使用时,使用 NewDog 类型的实例,它既可以调用 Dog 结构体的 Speak 方法(通过组合继承),又实现了新的 Run 方法。但要注意,这种方式在一些场景下可能需要调整原有代码对 Dog 类型实例的使用,改为使用 NewDog 类型实例。