在Golang中实现相同接口的不同结构

时间:2019-04-12 20:38:09

标签: go

我有一个界面

type Shape interface {
    area() float32
    circumference() float32
}

我想创建不同的形状,例如圆形和矩形,对于圆形我需要知道半径,对于矩形需要两个边。因此,每个代码都如下所示:

type DataCircle struct {
     radius float
}

(*DataCircle) area() float32 {
    return 3.14 * DataCircle.radius * DataCircle.radius;
}

(*DataCircle) circumference() float32 {
    return 2 * 3.14 * DataCircle.radius;
}

类似地,我们有一个矩形的代码,该代码实现了Shape的接口,并带有以下struct

type DataRectangle struct {
     side1 float
     side2 float
}

我想创建许多不同的矩形和许多不同的圆,每个圆都有不同的半径/边。最后,我想将它们放在一个数组中,并能够执行以下操作

for _, shape := range all_shapes_in_array {
    fmt.Printf("%f %f", shape.area(), shape.circumference())
}

在普通的面向对象语言中,这很简单,但是如何在Golang中实现呢?

1 个答案:

答案 0 :(得分:2)

只要您的DataCircleDataRectangle结构实现Shape接口,您就可以创建类型为Shape的数组/切片并对其进行迭代。 / p>

如果您已经让他们实现Shape,那么您要做的就是:

circle1 := &DataCircle{1}
circle2 := &DataCircle{2}
rec1 := &DataRectangle{1, 1}
rec2 := &DataRectangle{4, 1}

all_shapes_in_array := []Shape{circle1, circle2, rec1, rec2}
for _, shape := range all_shapes_in_array {
    fmt.Printf("%f %f", shape.area(), shape.circumference())
}

它将按预期工作。