• golang类型断言


    一、介绍

    类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言

    例子:

    package main
    import "fmt"
    
    func main(){
        var x interface{}
        
        var b2 float64 = 1.1
        x = b2 //空接口,可以接收任意值
        
        //类型断言
        y := x.(float64)
      //  y2 := x.(float32)  //不匹配会报错
        fmt.Printf("type:%T 值:%v",y,y)
     //   fmt.Printf("type:%T 值:%v",y2,y2)
        
    }
    
    ##结果####
    type:float64 值:1.1
    

      

    断言时带上检测机制,如果失败不报错

    例子:

    package main
    import "fmt"
    
    func main(){
        var x interface{}
        
        var b2 float64 = 1.1
        x = b2 //空接口,可以接收任意值
        
        //类型断言
       if y,ok := x.(float32); ok {
           fmt.Printf("type:%T 值:%v",y,y)
    
       }else{
           fmt.Println("error!")
       }
       fmt.Println("end") 
    }
    
    ###结果####
    error!
    end
    

      

    二、类型断言最佳实践

    例子 一:

    package main
    import "fmt"
    
    //定义一个usb接口
    type Usb interface {
        //声明了两个没有实现的方法
        Start()
        Stop()
    }
    
    type Phone struct {
        name string
    }
    
    //让 Phone 实现 Usb 接口的方法
    func (p Phone) Start() {
        fmt.Println("手机开始工作。。。")
    }
    func (p Phone) Stop() {
        fmt.Println("手机停止工作。。。")
    }
    func (p Phone) Call() {
        fmt.Println("手机 在打电话..")
    }
    
    type Camera struct {
        name string
    }
    //让 Camera 实现 Usb 接口的方法
    func (c Camera) Start() {
        fmt.Println("相机开始工作。。。")
    }
    func (c Camera) Stop() {
        fmt.Println("相机停止工作。。。")
    }
    type Computer struct {
    }
    
    func (computer Computer) Working(usb Usb) {
        usb.Start()
    //如果 usb 是指向 Phone 结构体变量,则还需要调用 Call 方法
        //类型断言
        if phone, ok := usb.(Phone); ok {
            phone.Call()
        }
        usb.Stop()
    }
    func main() {
        //定义一个 Usb 接口数组,可以存放 Phone 和 Camera 的结构体变量
        //这里就体现出多态数组
        var usbArr [3]Usb
        usbArr[0] = Phone{"vivo"}
        usbArr[1] = Phone{"小米"}
        usbArr[2] = Camera{"尼康"}
        //遍历 usbArr
    //Phone 还有一个特有的方法 call(),请遍历 Usb 数组,如果是 Phone 变量,
    //除了调用 Usb 接口声明的方法外,还需要调用 Phone 特有方法 call. =》类型断言
        var computer Computer
        for _, v := range usbArr{
        computer.Working(v)
        fmt.Println()
        }
    }
    
    ####结果####
    手机开始工作。。。
    手机 在打电话..
    手机停止工作。。。
    
    手机开始工作。。。
    手机 在打电话..
    手机停止工作。。。
    
    相机开始工作。。。
    相机停止工作。。。
    

      

     

    例子 二:

    package main
    import "fmt"
    
    //编写一个函数,判断输入参数的类型
    func GetType(items... interface{}) {
        for index,x := range items {
            switch x.(type) {
                case bool:
                    fmt.Printf("第%v个参数是bool类型,值是%v
    ",index,x)
                case int:
                    fmt.Printf("第%v个参数是int类型,值是%v
    ",index,x)
                case string:
                    fmt.Printf("第%v个参数是string类型,值是%v
    ",index,x)
                default:
                    fmt.Printf("第%v个参数类型不是上面的,值是%v
    ",index,x)
            }
    
        }
    
    }
    
    func main(){
        var n1 int = 1
        var n2 string = "dd"
        var n3 bool = false
        GetType(n1,n2,n3)
    
    }
    
    ###结果###
    第0个参数是int类型,值是1
    第1个参数是string类型,值是dd
    第2个参数是bool类型,值是false
    

      

  • 相关阅读:
    51. N皇后-递归dfs+回溯-困难
    Python基础/注意事项
    22. 括号生成-递归dfs回溯-中等难度
    40. 组合总和 II-递归dfs+剪枝-中等难度
    90. 子集 II-递归+dfs-中等难度
    78. 子集-递归+dfs-中等难度
    871. 最低加油次数-贪心-困难
    T-SQL 日期函数
    T-SQL DISTINCT子句 去重复
    T-SQL 数值函数
  • 原文地址:https://www.cnblogs.com/zhangb8042/p/10565131.html
Copyright © 2020-2023  润新知