zoukankan      html  css  js  c++  java
  • Golang-类型断言

    Golang-类型断言

    基本介绍

      类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言, 具体的如下:
         
        对上面代码的说明:
        在进行类型断言时,如果类型不匹配,就会报 panic, 因此进行类型断言时,要确保原来的空接口指向的就是断言的类型.
     
      如何在进行断言时,带上检测机制,如果成功就 ok,否则也不要报 panic
        

     类型断言的最佳实践 

      在前面的 Usb 接口案例做改进:
      给 Phone 结构体增加一个特有的方法 call(), 当 Usb 接口接收的是Phone 变量时,还需要调用 call方法
    package main 
    import (
    	"fmt"
    )
    	
    //声明/定义一个接口
    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{"phone"}
    	usbArr[2] = Camera{"华为"}
    
    	//遍历 usbArr
    	//Phone 还有一个特有的方法 call(),请遍历 Usb 数组,如果是 Phone 变量,
    	//除了调用 Usb 接口声明的方法外,还需要调用 Phone  特有方法 call. =》类型断言
    	var computer Computer
    	for _, v := range usbArr { 
    		computer.Working(v) 
    		fmt.Println()
    	}
    }
    

    类型断言

    func main() {
            var a interface{}
    	var points Points = Points{1,2}
    	a = points
    	var b Points
    	b = a.(Points) //*******
    	_, err := a.(Points) //带检测机制 成功返回true 失败返回false
    	fmt.Println(b)  
    }  
    

      

     
  • 相关阅读:
    SharePoint 2013 列表启用搜索
    SharePoint 2013 InfoPath 无法保存下列表单
    SharePoint 2013 图文开发系列之定义站点模板
    SharePoint 2013 图文开发系列之创建内容类型
    SharePoint 2013 图文开发系列之网站栏
    Linux的PCI驱动分析
    uCOS-ii笔记
    RTOS系统与Linux系统的区别
    Arduino+GPRS 的环境监控方案
    可视化机器学习工具软件的比较分析研究
  • 原文地址:https://www.cnblogs.com/Essaycode/p/12677732.html
Copyright © 2011-2022 走看看