Polymorphism using Interface in Golang

package main

import (
    "fmt"
    "reflect"
)

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

/* Square */

type Square struct {
    A float64
}

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

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

/* Rectangle */

type Rectangle struct {
    A float64
    B float64
}

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

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

func main() {

    square1 := Square{A: 5}
    square2 := Square{A: 10}
    rectangle1 := Rectangle{A: 5, B: 15}
    rectangle2 := Rectangle{A: 7, B: 27}
    geometries := []Geometry{square1, rectangle1, square2, rectangle2}
    for _, geometry := range geometries {
        fmt.Println(reflect.TypeOf(geometry).Name())
        fmt.Printf("Area: %0.2f\n", geometry.Area())
        fmt.Printf("Perimeter: %0.2f\n", geometry.Perimeter())
        fmt.Println("----------------------")
    }

}    
        
Square
Area: 25.00
Perimeter: 20.00      
----------------------
Rectangle
Area: 75.00
Perimeter: 40.00      
----------------------
Square
Area: 100.00
Perimeter: 40.00      
----------------------
Rectangle
Area: 189.00
Perimeter: 68.00      
----------------------