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 }
原文地址:https://www.cnblogs.com/luwei0915/p/15632929.html