面试官:Go 如何实现多态?

大家好,我是木川

Go 语言中实现多态的方式与传统的面向对象语言(如Java和C++)有所不同,因为 Go 不支持经典的类继承体系。在 Go 中,多态性通过接口(interfaces)和类型断言(type assertion)来实现,以下是具体的步骤

一、定义接口

首先需要定义一个接口,接口是一组方法的抽象描述。这些方法定义了类型必须实现的行为。例如:

type Shape interface {
    Area() float64
}

在这里,我们定义了一个名为 Shape 的接口,其中包含一个 Area() 方法的声明。

二、创建具体类型

然后创建具体类型,这些类型将实现接口中定义的方法。例如,我们可以创建一名为 CircleRectangle 的类型:

// 创建 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,然后将一个 CircleRectangle 的实例分配给它。随后,我们可以调用 sArea() 方法,这个方法会多态地调用对应结构体中的 Area() 方法。

总之,Go中实现多态性的方式是通过接口和方法的组合,允许不同类型实现相同的接口方法,从而实现多态性的效果。这种方式在Go中强调了灵活性和简洁性。

最后给自己的原创 Go 面试小册打个广告,如果你从事 Go 相关开发,欢迎扫码购买,目前 10 元买断,加下面的微信发送支付截图额外赠送一份自己录制的 Go 面试题讲解视频

面试官:Go 如何实现多态?_第1张图片

面试官:Go 如何实现多态?_第2张图片

如果对你有帮助,帮我点一下在看或转发,欢迎关注我的公众号

你可能感兴趣的:(golang,开发语言,后端)