面试题答案
一键面试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
结构体不需要做过多修改;而继承关系中,父类的修改可能会对所有子类产生较大影响。