美文网首页
Go语言之接口断言

Go语言之接口断言

作者: 测试探索 | 来源:发表于2020-06-06 16:23 被阅读0次
    前景

    因为空接口interface{}没有定义任何函数,因此Go中所有类型都实现了空接口。当一个函数的形参是interface{},那么在函数中,需要对形参进行断言,从而得到他的真实类型。

    语法
    //安全类型断言
    <目标类型的值>,<布尔参数> := <表达式>.(目标类型)
    
    //非安全类型断言
    <目标类型的值> := <表达式>.(目标类型)
    
    方式一:
        1.instance := 接口对象.(实际类型) // 不安全,会panic()
        2.instance,ok := 接口对象.(实际类型) //安全
    
    方式二:
        switch instance := 接口对象.(type){
        case 实际类型1:
                ...
        case 实际类型2:
                ...
    }
    
    
    package main
    
    import (
        "fmt"
        "math"
    )
    
    func main(){
    
        var t1 Triangle = Triangle{3,4,5}
        //t1 := Triangle{3,4,5}  与上面一样的概念
        fmt.Println("三角形的周长为:",t1.peri())  //三角形的周长为: 12
        fmt.Println("三角形的面积为:",t1.area()) //三角形的面积为: 6
    
        var c1 Circle = Circle{4}
        fmt.Println("C1的周长为:",c1.peri()) //C1的周长为: 25.132741228718345
        fmt.Println("c1的面积为:",c1.area()) //c1的面积为: 50.26548245743669
         
       //声明接口
        var s1 Shape
        s1 = t1
        fmt.Println(s1.peri()) //12
        fmt.Println(s1.area()) //6
    
        var s2 Shape
        s2 =c1
        fmt.Println(s2.peri()) //25.132741228718345
        fmt.Println(s2.area()) //50.26548245743669
    
        testShape(t1)  //周长:12.00,面积:6.00
        testShape(c1)  //周长:25.13,面积:50.27
        testShape(s1)  //周长:12.00,面积:6.00
    
        getType(t1)  //是三角形,三边是: 3 4 5
        getType(c1)  //是圆形,半径是: 4
        getType(s1)  //是三角形,三边是: 3 4 5
    
        var t2 *Triangle = &Triangle{3,4,2}
        fmt.Printf("t2:%T,%p\n",t2,&t2) //t2:*main.Triangle,0xc000006030
        getType(t2)//ins:*main.Triangle,0xc000006038  s:*main.Triangle,0xc00003c220
    
    }
    
    func getType(s Shape){
        //断言
        if ins,ok := s.(Triangle);ok{
            fmt.Println("是三角形,三边是:",ins.a,ins.b,ins.c)
        }else if ins,ok := s.(Circle);ok{
            fmt.Println("是圆形,半径是:",ins.radius)
        }else if ins,ok:= s.(*Triangle);ok{
            fmt.Printf("ins:%T,%p\n",ins,&ins)
            fmt.Printf("s:%T,%p\n",s,&s)
        }else{
            fmt.Println("我也不知道了")
        }
    }
    
    func testShape(s Shape){
        fmt.Printf("周长:%.2f,面积:%.2f\n",s.peri(),s.area())
    }
    
    //1.定义一个接口
    type Shape interface{
        peri() float64 //形状的周长
        area() float64 //形状的面积
    }
    
    //2.定义实现类:三角形
    type Triangle struct {
        //a float64
        //b float64
        //c float64
        a,b,c float64 //与注释掉的一样
    }
    
    func (t Triangle) peri() float64{
    
        return t.a + t.b + t.c
    }
    
    func (t Triangle) area() float64{
        p := t.peri() /2
        s := math.Sqrt(p*(p-t.a)*(p-t.b)*(p-t.c))
        return s
    }
    
    //3定义另一个实现类:圆形
    type Circle struct{
        radius float64
    }
    
    func (c Circle) peri() float64{
        return c.radius *2 * math.Pi
    }
    
    func (c Circle) area() float64{
        return math.Pow(c.radius,2)*math.Pi
    }
    

    相关文章

      网友评论

          本文标题:Go语言之接口断言

          本文链接:https://www.haomeiwen.com/subject/izywzhtx.html