• 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 }
  • 相关阅读:
    WCF如何通过契约加编码方式调用
    编码为multipart/form-data自定义类型(包括文件)如何自动绑定到webapi的action的参数里
    MSMQ消息队列
    使用windows服务和MSMQ和进行日志管理(解决高并发问题)
    二叉树的三种遍历方式
    go语言的3个包——strconv、os.Args、flag
    公钥、私钥、签名、数字证书的关系
    go语言实现单链表
    Go语言学习笔记(10)——错误处理示例
    go语言实现链式栈
  • 原文地址:https://www.cnblogs.com/luwei0915/p/15632929.html
Copyright © 2020-2023  润新知