Polymorphism in Object Oriented Programming in Golang

Create new folder named entities. In entities folder, create new entities as below:

In entities folder, create new file named geometry.go as below:

package entities

type Geometry interface {
	GetName() string
	Area() float64
	Perimeter() float64
}

In entities folder, create new file named circle.go as below:

package entities

import "math"

type Circle struct {
	Name string
	R    float64
}

func (circle Circle) GetName() string {
	return circle.Name
}

func (circle Circle) Area() float64 {
	return math.Pi * circle.R * circle.R
}

func (circle Circle) Perimeter() float64 {
	return 2 * math.Pi * circle.R
}




In entities folder, create new file named square.go as below:

package entities

type Square struct {
	Name string
	A    float64
}

func (square Square) GetName() string {
	return square.Name
}

func (square Square) Area() float64 {
	return square.A * square.A
}

func (square Square) Perimeter() float64 {
	return square.A * 4
}

In entities folder, create new file named rectangle.go as below:

package entities

type Rectangle struct {
	Name string
	A    float64
	B    float64
}

func (rectangle Rectangle) GetName() string {
	return rectangle.Name
}

func (rectangle Rectangle) Area() float64 {
	return rectangle.A * rectangle.B
}

func (rectangle Rectangle) Perimeter() float64 {
	return (rectangle.A + rectangle.B) * 2
}

Create new folder named src. In src folder, create new file named main.go as below:

package main

import (
	"entities"
	"fmt"
)

func main() {

	circle1 := entities.Circle{Name: "Circle 1", R: 4}
	circle2 := entities.Circle{Name: "Circle 2", R: 7}
	rectangle1 := entities.Rectangle{Name: "Rectangle 1", A: 4, B: 10}
	rectangle2 := entities.Rectangle{Name: "Rectangle 1", A: 2, B: 7}
	square1 := entities.Square{Name: "Square 1", A: 6}
	square2 := entities.Square{Name: "Square 1", A: 10}

	geometries := []entities.Geometry{circle1, rectangle1, square1, rectangle2, square2, circle2}

	for _, geometry := range geometries {
		fmt.Println(geometry.GetName())
		fmt.Printf("Area: %0.2f\n", geometry.Area())
		fmt.Printf("Perimeter: %0.2f\n", geometry.Perimeter())
		fmt.Println("----------------------")
	}

}




Open Terminal windows in Visual Studio Code and run command line: go run main.go

Circle 1
Area: 50.27
Perimeter: 25.13
----------------------
Rectangle 1
Area: 40.00
Perimeter: 28.00
----------------------
Square 1
Area: 36.00
Perimeter: 24.00
----------------------
Rectangle 1
Area: 14.00
Perimeter: 18.00
----------------------
Square 1
Area: 100.00
Perimeter: 40.00
----------------------
Circle 2
Area: 153.94
Perimeter: 43.98
----------------------