爬行的蜗牛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: golang Linux PHP
查看: 27|回复: 0

接口断言

[复制链接]

94

主题

36

回帖

849

积分

管理员

积分
849
发表于 2024-11-7 22:07:26 | 显示全部楼层 |阅读模式
  1. package main

  2. import (
  3.         "fmt"
  4.         "math"
  5. )

  6. func main() {
  7.         /*接口断言:
  8.         方式一:
  9.                 1.instance := 接口对象.(实际类型) //不安全,会panic()
  10.                 2.instance,ok := 接口对象.(实际类型) //安全

  11.         方式二:switch
  12.                 switch instance := 接口对象.(type){
  13.                 case 实际类型1:
  14.                                 。。。。
  15.                 。。。。
  16.                 }
  17.         */
  18.         var t1 Triangle = Triangle{3, 4, 5}
  19.         fmt.Println(t1.peri())
  20.         fmt.Println(t1.area())
  21.         fmt.Println(t1.a, t1.b, t1.c)
  22.         var c1 Circle = Circle{4}
  23.         fmt.Println(c1.peri())
  24.         fmt.Println(c1.area())
  25.         fmt.Println(c1.radius)
  26.         var s1, s2 Shape
  27.         s1 = t1
  28.         fmt.Println(s1.peri())
  29.         fmt.Println(s1.area())
  30.         s2 = c1
  31.         fmt.Println(s2.peri())
  32.         fmt.Println(s2.area())

  33.         testShape(t1)
  34.         testShape(c1)
  35.         testShape(s1)

  36.         getType(t1)
  37.         fmt.Println("----------------")
  38.         getType(c1)
  39.         fmt.Println("----------------")
  40.         getType(s1)
  41.         fmt.Println("----------------")
  42.         //错误的   getType(100)

  43.         var t2 *Triangle = &Triangle{3, 4, 2}
  44.         fmt.Printf("t2:%T,%p,%p\n", t2, &t2, t2)
  45.         getType(t2)
  46.         getType2(t2)
  47.         getType2(t1)
  48. }

  49. func getType2(s Shape) {
  50.         switch ins := s.(type) {
  51.         case Triangle:
  52.                 fmt.Println("三角形。。。。", ins.a, ins.b, ins.c)
  53.         case Circle:
  54.                 fmt.Println("圆形。。", ins.radius)
  55.         case *Triangle:
  56.                 fmt.Println("三角形结构体指针", ins.a, ins.b, ins.c)
  57.         }
  58. }
  59. func testShape(s Shape) {
  60.         fmt.Printf("周长:%.2f,面积:%.2f\n", s.peri(), s.area())
  61. }
  62. func getType(s Shape) {
  63.         if ins, ok := s.(Triangle); ok {
  64.                 fmt.Println("是三角形,三边是:", ins.a, ins.b, ins.c)
  65.         } else if ins, ok := s.(Circle); ok {
  66.                 fmt.Println("是圆形,半径是:", ins.radius)
  67.         } else if ins, ok := s.(*Triangle); ok {
  68.                 fmt.Printf("ins:%T,%p,%p\n", ins, &ins, ins)
  69.                 fmt.Printf("ins:%T,%p,%p\n", s, &s, s)
  70.         } else {
  71.                 fmt.Println("我也不知道了。。。。")
  72.         }
  73. }

  74. // 1.定义一个接口
  75. type Shape interface {
  76.         peri() float64 //形状周长
  77.         area() float64 //形状面积
  78. }

  79. // 2.定义实现类:三角形
  80. type Triangle struct {
  81.         //a float64
  82.         //b float64
  83.         //c float64
  84.         a, b, c float64
  85. }

  86. func (t Triangle) peri() float64 {
  87.         return t.a + t.b + t.c
  88. }

  89. func (t Triangle) area() float64 {
  90.         p := t.peri() / 2
  91.         s := (p * (p - t.a) * (p - t.b) * (p - t.c))
  92.         return s
  93. }

  94. type Circle struct {
  95.         radius float64
  96. }

  97. func (c Circle) peri() float64 {
  98.         return c.radius * 2 * math.Pi
  99. }
  100. func (c Circle) area() float64 {
  101.         return math.Pow(c.radius, 2) * math.Pi
  102. }
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表