Go is fresh fast relatively new language. One of the key to utilize it’s power are interfaces. Here is example of the geometry interfaces. See https://play.golang.org/p/nQ_ylb2jXKS

package main import ( "fmt" "math" ) //https://www.mathsisfun.com/area.html type geometry interface { area() float64 perimeter() float64 } type square struct { side float64 } type rectangle struct { width, height float64 } type triangle struct { a, b, c float64 } type circle struct { radius float64 } func (s square) area() float64 { return s.side * s.side } func (s square) perimeter() float64 { return 4 * s.side } func (r rectangle) area() float64 { return r.width * r.height } func (r rectangle) perimeter() float64 { return 2*r.width + 2*r.height } func (t triangle) area() float64 { cosGama := (t.c*t.c - t.a*t.a - t.b*t.b) / (2 * t.a * t.b) if math.Abs(cosGama) > 1.0 { fmt.Println("Input values are not for triangle") return -1 } sinGama := math.Sqrt(1.0 - cosGama*cosGama) heightA := t.b * sinGama // fmt.Printf("triangle: cos=%f, sin=%f,hA=%f\n",cosGama,sinGama,heightA) return t.a * heightA } func (t triangle) perimeter() float64 { return t.a + t.b + t.c } func (c circle) area() float64 { return math.Pi * c.radius * c.radius } func (c circle) perimeter() float64 { return 2 * math.Pi * c.radius } func measure(g geometry) { fmt.Println(g) fmt.Printf("area : %f \n", g.area()) fmt.Printf("perimeter: %f \n", g.perimeter()) } func main() { s := square{side: 2} r := rectangle{width: 3, height: 4} t1 := triangle{a: 3, b: 4, c: 5} t2 := triangle{a: 1, b: 1, c: 1} t3 := triangle{a: 1, b: 1, c: 30} c := circle{radius: 5} measure(s) measure(r) measure(t1) measure(t2) measure(t3) measure(c) }