/
20.Interfaces.go
77 lines (57 loc) · 1.55 KB
/
20.Interfaces.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
Title: 20.Interfaces.go
Author: OpenSource
Date: 2017-05-21
Description: For Study
Interfaces are named collections of method signatures.
*/
package main
import "fmt"
import "math"
// define struct
// For our example we’ll implement this interface on rect and circle types.
type rect struct {
width, height float64
}
type circle struct {
radius float64
}
// type geometry
type geometry interface{
// Here’s a basic interface for geometric shapes.
area() float64
perim() float64
}
// impl methods
// To implement an interface in Go, we just need to implement all the methods in the interface. Here we implement geometry on rects.
func (r rect) area() float64 {
return r.width * r.height
}
func (r rect) perim() float64 {
return 2*r.width + 2*r.height
}
// The implementation for circles.
func (c circle) area() float64 {
return math.Pi * c.radius * c.radius
}
// The implementation for circles.
func (c circle) perim() float64 {
return 2 * math.Pi * c.radius
}
// If a variable has an interface type,
// then we can call methods that are in the named interface.
// Here’s a generic measure function taking advantage of this to work on any geometry.
func measure (g geometry ) {
fmt.Println("measure")
fmt.Println(g)
fmt.Println(g.area())
fmt.Println(g.perim())
}
func main() {
fmt.Println("20.Interfaces.go--------Start-----------\n\n")
r := rect{width: 3, height: 4}
c := circle{radius: 5}
measure(r)
measure(c)
fmt.Println("20.Interfaces.go---------End------------\n\n")
}