diff --git a/go/02-next-level/01-interfaces.go b/go/02-next-level/01-interfaces.go new file mode 100644 index 0000000..6a6e25f --- /dev/null +++ b/go/02-next-level/01-interfaces.go @@ -0,0 +1,60 @@ +package main + +import ( + "fmt" + "math" +) + +type geometry interface { + area() float64 + perim() float64 +} + +type rect struct { + width, height float64 +} + +var _ geometry = rect{} + +type circle struct { + radius float64 +} + +var _ geometry = circle{} + +func (r rect) area() float64 { + return r.width * r.height +} +func (r rect) perim() float64 { + return 2*r.width + 2*r.height +} + +func (c circle) area() float64 { + return math.Pi * c.radius * c.radius +} +func (c circle) perim() float64 { + return 2 * math.Pi * c.radius +} + +func measure(g geometry) { + fmt.Println(g) + fmt.Println(g.area()) + fmt.Println(g.perim()) +} + +func detectCircle(g geometry) { + if c, ok := g.(circle); ok { + fmt.Println("circle with radius", c.radius) + } +} + +func main() { + r := rect{width: 3, height: 4} + c := circle{radius: 5} + + measure(r) + measure(c) + + detectCircle(r) + detectCircle(c) +}