package main
type geometry interface {
area() float64
perim() float64
}
type rect struct {
width, height float64
}
func (r rect) perim() float64 {
return 2*r.width + 2*r.height
}
func (r rect) area() float64 {
return r.width * r.height
}
func measure(x geometry) float64 {
return x.perim()
}
func measure2(x geometry, f float64, y geometry) float64 {
return x.perim() + f + y.perim()
}
func measure3(x geometry, c float64, v... geometry) float64 {
total := x.perim() + c
for _, g := range v {
total += g.perim()
}
return total
}
func measure4(x geometry, v... float64) float64 {
total := x.perim()
for _, g := range v {
total += g
}
return total
}
/*
type circle struct {
radius float64
}
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 c.radius * c.radius
}
func (c circle) perim() float64 {
return 1 * c.radius
}
func measure(g geometry) {
assert(g.area() == 1)
}
*/
func aaa() (int, *rect) {
var r rect
r2 := &r
r.height = 2
assert(2 == r2.height)
return 1, r2
}
func main() {
var r rect
r.height = 8
assert(8 == r.height)
var g geometry
f, g := -6, &r
assert(f == -6)
assert(16 == measure(g))
f, g = aaa()
assert(f == 1)
assert(4 == measure(g))
assert(37 == measure2(r, 5, r))
assert(16 * 3 + 5 == 53)
//measure3(r, 2, r, r, r)
assert(53 == measure3(r, 5, r, r))
assert(30 == measure4(r, 2, 3,4,5))
/*
r := rect{width: 1, height: 1}
c := circle{radius: 1}
measure(r)
measure(c)
*/
}