78_Go基础_1_46 类型断言
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 }