Reputation: 65
I have an interface
type Shape interface {
area() float32
circumference() float32
}
I want to create different shapes such as a circle and a rectangle, for the circle I need to know the radius, and for the rectangle the 2 sides. So the code for each is like the following:
type DataCircle struct {
radius float
}
(*DataCircle) area() float32 {
return 3.14 * DataCircle.radius * DataCircle.radius;
}
(*DataCircle) circumference() float32 {
return 2 * 3.14 * DataCircle.radius;
}
Similarly we have code for a rectangle which implement the interface Shape, with the following struct
type DataRectangle struct {
side1 float
side2 float
}
I want to create many different Rectangles and many different Circles, each one has different radius/sides. In the end I want to put them in a single array and be able to do something like the following
for _, shape := range all_shapes_in_array {
fmt.Printf("%f %f", shape.area(), shape.circumference())
}
In a normal object oriented language this is pretty straight forward, but how do I do it in Golang?
Upvotes: 1
Views: 570
Reputation: 4242
As long as your DataCircle
and DataRectangle
structs implement the Shape
interface you will be able to create an array/slice of type Shape
and iterate through it.
If you already have them implementing Shape
then all you need to do is this:
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())
}
And it will work as expected.
Upvotes: 2