面试题答案
一键面试- 定义简洁接口
- 以一个简单的图形绘制库为例,假设我们有不同的图形,如圆形、矩形。首先定义一个
Shape
接口:
- 以一个简单的图形绘制库为例,假设我们有不同的图形,如圆形、矩形。首先定义一个
type Shape interface {
Area() float64
Perimeter() float64
}
- 这里
Shape
接口只包含了两个必要的方法Area
(计算面积)和Perimeter
(计算周长)。这两个方法是图形通用且必要的属性计算方法,没有添加多余的方法,保证了接口的简洁性。
- 具体类型实现接口
- 对于圆形
Circle
类型:
- 对于圆形
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
func (c Circle) Perimeter() float64 {
return 2 * 3.14 * c.Radius
}
- 对于矩形
Rectangle
类型:
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}
- 每个具体类型只需要实现
Shape
接口定义的方法,这样的实现清晰简洁,且每个方法的功能明确,避免了冗余。
- 利用接口实现高效操作
- 假设有一个函数,需要计算多个图形的总面积,我们可以这样定义:
func TotalArea(shapes []Shape) float64 {
var total float64
for _, shape := range shapes {
total += shape.Area()
}
return total
}
- 通过将不同类型的图形(只要它们实现了
Shape
接口)都可以传入TotalArea
函数,实现了多态操作。这里的接口调用是高效的,因为Go语言的接口实现基于动态类型断言,在运行时确定具体类型并调用相应方法,开销相对较小。同时,由于接口方法定义简洁,在调用时不需要进行额外的、不必要的方法查找,保证了性能。
在实际项目中,通过明确业务需求,提取核心功能作为接口方法,同时让具体类型高效实现这些方法,就能在接口设计中较好地平衡简洁性与高效性。