大家好,我是木川
Go 语言中实现多态的方式与传统的面向对象语言(如Java和C++)有所不同,因为 Go 不支持经典的类继承体系。在 Go 中,多态性通过接口(interfaces)和类型断言(type assertion)来实现,以下是具体的步骤
一、定义接口
首先需要定义一个接口,接口是一组方法的抽象描述。这些方法定义了类型必须实现的行为。例如:
type Shape interface {
Area() float64
}
在这里,我们定义了一个名为 Shape
的接口,其中包含一个 Area()
方法的声明。
二、创建具体类型
然后创建具体类型,这些类型将实现接口中定义的方法。例如,我们可以创建一名为 Circle
和 Rectangle
的类型:
// 创建 Circle 结构体,实现 Area() 方法
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
// 创建 Rectangle 结构体,实现 Area() 方法
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
创建了一个 Circle
结构体,并为它定义了 Area()
方法,以计算圆的面积
创建了一个 Rectangle
结构体,并为它定义了 Area()
方法,以计算长方形的面积。
三、使用接口
接下来创建接口类型的变量,并将具体类型的实例赋给这些变量。这就允许你调用接口中的方法,而不用关心具体的类型。示例如下:
func main() {
var s Shape
// 将Circle实例赋给Shape类型的变量
s = Circle{Radius: 5}
// 类型断言
if _, ok := s.(Circle); ok {
fmt.Println("我是圆形")
}
fmt.Println("Area of the shape:", s.Area())
// 将Rectangle实例赋给Shape类型的变量
s = Rectangle{Width: 4, Height: 6}
// 类型断言
if _, ok := s.(Rectangle); ok {
fmt.Println("我是长方形")
}
fmt.Println("Area of the shape:", s.Area())
}
在这个示例中,我们创建了一个 Shape
类型的变量 s
,然后将一个 Circle
和Rectangle
的实例分配给它。随后,我们可以调用 s
的 Area()
方法,这个方法会多态地调用对应结构体中的 Area()
方法。
总之,Go中实现多态性的方式是通过接口和方法的组合,允许不同类型实现相同的接口方法,从而实现多态性的效果。这种方式在Go中强调了灵活性和简洁性。
最后给自己的原创 Go 面试小册打个广告,如果你从事 Go 相关开发,欢迎扫码购买,目前 10 元买断,加下面的微信发送支付截图额外赠送一份自己录制的 Go 面试题讲解视频
如果对你有帮助,帮我点一下在看或转发,欢迎关注我的公众号