在 Go 语言中,多态是通过接口(interface)来实现的。接口定义了一组方法,但不实现它们。任何实现了这些方法的类型都可以被认为实现了该接口,从而具有多态性。
下面是一个简单的示例,展示了如何使用接口实现多态:
package main
import (
"fmt"
)
// 定义一个接口 Shape,包含一个方法 Area()
type Shape interface {
Area() float64
}
// 定义一个矩形结构体 Rectangle
type Rectangle struct {
Width float64
Height float64
}
// 为 Rectangle 类型实现 Shape 接口的 Area() 方法
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
// 定义一个圆形结构体 Circle
type Circle struct {
Radius float64
}
// 为 Circle 类型实现 Shape 接口的 Area() 方法
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
// 计算形状的总面积
func TotalArea(shapes []Shape) float64 {
total := 0.0
for _, shape := range shapes {
total += shape.Area()
}
return total
}
func main() {
shapes := []Shape{
Rectangle{Width: 10, Height: 5},
Circle{Radius: 3},
}
fmt.Println("Total area:", TotalArea(shapes))
}
在这个示例中,我们定义了一个名为 Shape
的接口,它包含一个名为 Area()
的方法。然后,我们定义了两个结构体 Rectangle
和 Circle
,并为它们分别实现了 Area()
方法。这样,Rectangle
和 Circle
都实现了 Shape
接口,具有了多态性。
在 TotalArea
函数中,我们接受一个 Shape
类型的切片作为参数,并遍历它,累加每个形状的面积。这里,我们可以使用任何实现了 Shape
接口的类型,而不仅仅是 Rectangle
和 Circle
。这就是多态的体现。