MST

星途 面试题库

面试题:Go语言中如何通过组合实现代码复用

请描述在Go语言里,怎样使用组合来复用代码,并给出一个简单的示例,说明组合相较于继承在代码复用方面的优势。
35.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

1. 使用组合复用代码的方式

在Go语言中,通过在结构体中嵌入其他结构体来实现组合。例如:

package main

import "fmt"

// 被组合的基础结构体
type Engine struct {
    Power int
}

func (e Engine) Start() {
    fmt.Printf("Engine with power %d started\n", e.Power)
}

// 组合结构体
type Car struct {
    Engine
    Brand string
}

在上述代码中,Car 结构体嵌入了 Engine 结构体。这样 Car 结构体就自动拥有了 Engine 结构体的所有方法和字段。

2. 示例

func main() {
    myCar := Car{
        Engine: Engine{
            Power: 150,
        },
        Brand: "Toyota",
    }
    myCar.Start()
}

main 函数中,创建了一个 Car 实例,并调用了从 Engine 结构体继承过来的 Start 方法。

3. 组合相较于继承在代码复用方面的优势

  • 灵活性更高:组合允许在运行时改变所包含的对象,而继承是在编译时就确定的。例如,Car 结构体可以在运行时根据不同需求更换不同的 Engine 实现。
  • 避免多重继承的复杂性:在一些支持多重继承的语言中,会出现菱形继承等复杂问题,而Go语言通过组合方式,简单清晰地实现代码复用,不会有这种困扰。
  • 松耦合:组合方式下,各个结构体之间的耦合度更低。如果 Engine 结构体的实现发生变化,只要其对外的方法签名不变,Car 结构体不需要做过多修改;而继承关系中,父类的修改可能会对所有子类产生较大影响。