zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    【gulp】Gulp的安装和配置 及 系列插件
    python函数:装饰器、修正、语法糖、有参装饰器、global与nonlocal
    python函数:函数参数、对象、嵌套、闭包与名称空间、作用域
    python函数:函数阶段练习
    python函数:函数使用原则、定义与调用形式
    python文件操作:文件指针移动、修改
    python文件操作:文件处理与操作模式
    python文件操作:文件处理案例
    python文件操作:字符编码与文件处理
    python基础:数据类型二
  • 原文地址:https://www.cnblogs.com/zhangb8042/p/10565131.html
Copyright © 2011-2022 走看看