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)  
}  

  

 

猜你喜欢

转载自www.cnblogs.com/Essaycode/p/12677732.html