1 package main
2
3 import (
4 "fmt"
5 "math"
6 )
7
8 // 1.定义一个接口
9 type Shape interface {
10 peri() float64 // 形状的周长
11 area() float64 // 形状的面积
12 }
13
14 // 2.定义实现类:三角形
15 type Triangle struct {
16 //a float64
17 //b float64
18 //c float64
19 a, b, c float64
20 }
21
22 type Circle struct {
23 radius float64
24 }
25
26 func (t Triangle) peri() float64 {
27 return t.a + t.b + t.c
28 }
29
30 func (t Triangle) area() float64 {
31 p := t.peri() / 2
32 s := math.Sqrt(p * (p - t.a) * (p - t.b) * (p - t.c))
33 return s
34 }
35
36 func (c Circle) peri() float64 {
37 return c.radius * 2 * math.Pi
38 }
39
40 func (c Circle) area() float64 {
41 return math.Pow(c.radius, 2) * math.Pi
42 }
43
44 func getType(s Shape) {
45 // 断言
46 if ins, ok := s.(Triangle); ok {
47 fmt.Println("是三角形,三边是:", ins.a, ins.b, ins.c)
48 } else if ins, ok := s.(Circle); ok {
49 fmt.Println("是圆形,半径是:", ins.radius)
50 } else if ins, ok := s.(*Triangle); ok {
51 fmt.Printf("ins:%T,%p,%p\n", ins, &ins, ins)
52 fmt.Printf("s:%T,%p,%p\n", s, &s, s)
53 } else {
54 fmt.Println("我也不知道了。。。")
55
56 }
57 }
58
59 func getType2(s Shape) {
60 switch ins := s.(type) {
61 case Triangle:
62 fmt.Println("三角形。。", ins.a, ins.b, ins.c)
63 case Circle:
64 fmt.Println("圆形。。", ins.radius)
65 case *Triangle:
66 fmt.Println("三角形结构体指针:", ins.a, ins.b, ins.c)
67 }
68 }
69
70 func testShape(s Shape) {
71 fmt.Printf("周长:%.2f,面积:%.2f\n", s.peri(), s.area())
72 }
73
74 func main() {
75 /*
76 接口断言:
77 方式一:
78 1.instance := 接口对象.(实际类型) // 不安全,会panic()
79 2.instance, ok := 接口对象.(实际类型) // 安全
80
81 方式二:switch
82 switch instance := 接口对象.(type){
83 case 实际类型1:
84 ....
85 case 实际类型2:
86 ....
87 ....
88 }
89 */
90
91 var t1 Triangle = Triangle{3, 4, 5}
92 fmt.Println(t1.peri()) // 12
93 fmt.Println(t1.area()) // 6
94 fmt.Println(t1.a, t1.b, t1.c) // 3 4 5
95
96 var c1 Circle = Circle{4}
97 fmt.Println(c1.peri()) // 25.132741228718345
98 fmt.Println(c1.area()) // 50.26548245743669
99 fmt.Println(c1.radius) // 4
100
101 var s1 Shape
102 s1 = t1
103 fmt.Println(s1.peri())
104 fmt.Println(s1.area())
105
106 var s2 Shape
107 s2 = c1
108 fmt.Println(s2.peri())
109 fmt.Println(s2.area())
110
111 testShape(t1) // 周长:12.00,面积:6.00
112 testShape(c1) // 周长:25.13,面积:50.27
113 testShape(s1) // 周长:12.00,面积:6.00
114
115 getType(t1) // 是三角形,三边是: 3 4 5
116 getType(c1) // 是圆形,半径是: 4
117 getType(s1) // 是三角形,三边是: 3 4 5
118 // getType(100)
119
120 var t2 *Triangle = &Triangle{3, 4, 2}
121 fmt.Printf("t2:%T,%p,%p\n", t2, &t2, t2) // t2:*main.Triangle,0xc000006030,0xc0000121f8
122 getType(t2) // 自身地址不一样,里面存的地址一样,引用传递
123 // ins:*main.Triangle,0xc000006038,0xc0000121f8
124 // s:*main.Triangle,0xc000046260,0xc0000121f8
125 getType2(t2) // 三角形结构体指针: 3 4 2
126 getType2(t1) // 三角形。。 3 4 5
127
128 }