diff --git a/go/02-next-level/00-methods.go b/go/02-next-level/00-methods.go new file mode 100644 index 0000000..ae1a6ac --- /dev/null +++ b/go/02-next-level/00-methods.go @@ -0,0 +1,26 @@ +package main + +import "fmt" + +type Counter struct { + value int +} + +// pointer receiver. The method operates directly on the object c points to +// Use a pointer receiver whenever the object needs to be modified. +func (c *Counter) Increment() { + c.value++ +} + +// value receiver. The method operates on copy of object c. Use a value +// receiver when the object does not need to be modified in the method. +func (c Counter) String() string { + return fmt.Sprintf("Counter value: %d", c.value) +} + +func main() { + c := Counter{} + fmt.Println(c) + c.Increment() + fmt.Println(c) +} diff --git a/go/02-next-level/01-interfaces.go b/go/02-next-level/01-interfaces.go new file mode 100644 index 0000000..c0eb97f --- /dev/null +++ b/go/02-next-level/01-interfaces.go @@ -0,0 +1,66 @@ +package main + +import ( + "fmt" + "math" +) + +type geometry interface { + area() float64 + perim() float64 +} + +type rect struct { + width, height float64 +} + +// Ensure that rect implements the geometry interface +var _ geometry = rect{} + +type circle struct { + radius float64 +} + +// Ensure that circle implements the geometry interface +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 +} + +//Metods demonstrates how to use an interface +func measure(g geometry) { + fmt.Println(g) + fmt.Println(g.area()) + fmt.Println(g.perim()) +} + + +//Method demonstrates casting an interface to a concrete type. +//Should be avoided in practice whenever possible. +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) +}