MST

星途 面试题库

面试题:Go语言接口设计中函数签名的多态性应用

给定一个Go语言的接口 `Shape`,包含函数签名 `Area() float64`。编写两个结构体 `Circle` 和 `Rectangle` 分别实现 `Shape` 接口。然后创建一个函数 `TotalArea`,它接受一个 `Shape` 接口类型的切片作为参数,计算并返回所有形状的总面积。解释这个过程中函数签名如何实现多态性以及这样设计的好处。
10.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "math"
)

// Shape 接口定义了计算面积的方法
type Shape interface {
    Area() float64
}

// Circle 结构体表示圆形
type Circle struct {
    Radius float64
}

// Area 方法计算圆形的面积
func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

// Rectangle 结构体表示矩形
type Rectangle struct {
    Width  float64
    Height float64
}

// Area 方法计算矩形的面积
func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

// TotalArea 函数计算形状切片的总面积
func TotalArea(shapes []Shape) float64 {
    var total float64
    for _, shape := range shapes {
        total += shape.Area()
    }
    return total
}
  1. 多态性的实现
    • 在Go语言中,虽然没有传统面向对象语言中的类继承体系,但通过接口实现了多态。
    • CircleRectangle 结构体都实现了 Shape 接口的 Area 方法。TotalArea 函数接受一个 Shape 接口类型的切片作为参数。在函数内部,通过 shape.Area() 调用不同结构体的 Area 方法,具体调用哪个方法取决于 shape 实际指向的结构体类型(是 Circle 还是 Rectangle)。这就是多态性的体现,同一个接口类型的变量可以在运行时表现出不同的行为。
  2. 这样设计的好处
    • 可扩展性:如果需要添加新的形状,比如 Triangle,只需要创建 Triangle 结构体并实现 Shape 接口的 Area 方法,TotalArea 函数无需修改即可处理新的形状。
    • 代码复用TotalArea 函数可以处理任何实现了 Shape 接口的类型,而不需要为每种形状都写一个特定的计算总面积的函数,提高了代码的复用性。
    • 松耦合:各个形状结构体和 TotalArea 函数之间通过接口进行交互,降低了它们之间的耦合度。形状结构体的实现细节可以改变,只要它依旧实现了 Shape 接口,TotalArea 函数就不受影响。