Golang的类型断言的使用

1.把接口转为结构体,再塞给一个结构体的变量

Go 复制代码
package main

//把接口转为结构体,再塞给一个结构体的变量
// 结构体=接口.(结构体)
import "fmt"

type Point struct {
	x int
	y int
}

func main() {
	var a interface{}
	var point Point = Point{1, 2}
	a = point //ok,什么东西都能塞给空接口

	//将a赋给一个Point变量
	var b Point
	//b = a 失败,因为空接口不能塞给具体类型
	b = a.(Point)
	fmt.Println(b)

	//类型断言的其他案例
	var x interface{}
	var b2 float32 = 1.1
	x = b2 //变量塞给空接口,可以【类型推断】

	y, ok := x.(float64)
	if ok == true {
		fmt.Println("convert success")
		fmt.Printf("y的类型是%T 值是=%v", y, y)
	} else {
		fmt.Println("convert fail")
	}

	fmt.Println("继续胡扯")
}
Go 复制代码
{1 2}
convert fail
继续胡扯   

2.接口体现多态:多态参数

Go 复制代码
package main

//接口,接口体现多态:多态参数

import "fmt"

// interface不能包含任何变量
type Usb interface {
	start()
	stop()
}

// 手机实现User方法
type Phone struct {
	name string
}

func (p Phone) start() {
	fmt.Println("手机开始工作")
}
func (p Phone) stop() {
	fmt.Println("手机停止工作")
}
func (p Phone) Call() {
	fmt.Println("手机再打电话...")
}

type Camera struct {
	name string
}

func (c Camera) start() {
	fmt.Println("摄像机开始工作")
}
func (c Camera) stop() {
	fmt.Println("摄像机停止工作")
}

// 计算机
type Computer struct {
}

// Working方法,接受一个User接口的类型变量
func (c Computer) Working(usb Usb) {
	//通过接口变量来调用start,stop方法
	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{"oppo"}
	usbArr[1] = Phone{"vivo"}
	usbArr[2] = Camera{"索尼"}
	fmt.Println(usbArr)
	var computer Computer
	for _, v := range usbArr {
		computer.Working(v)
	}
}
Go 复制代码
手机停止工作
手机开始工作
手机再打电话...
手机停止工作
摄像机开始工作
摄像机停止工作

3.编写一个函数,可以判断输入的参数是什么类型

Go 复制代码
package main

import "fmt"

//编写一个函数,可以判断输入的参数是什么类型

func TypeJudge(items ...interface{}) {
	for index, x := range items {
		switch x.(type) {
		case bool:
			fmt.Printf("第%v个参数是bool类型,值是%v\n", index, x)
		case float32:
			fmt.Printf("第%v个参数是float32类型,值是%v\n", index, x)
		case float64:
			fmt.Printf("第%v个参数是float64类型,值是%v\n", index, x)
		case int, int32, int64:
			fmt.Printf("第%v个参数是int类型,值是%v\n", index, x)
		case string:
			fmt.Printf("第%v个参数是string类型,值是%v\n", index, x)
		default:
			fmt.Printf("第%v个参数的类型不确定,值是%v\n", index, x)
		}
	}
}

func main() {
	var n1 float32 = 1.1
	var n2 float64 = 2.3
	var n3 int32 = 30
	var name string = "tom"
	address := "北京"
	n4 := 3000
	TypeJudge(n1, n2, n3, name, address, n4)
}
Go 复制代码
第0个参数是float32类型,值是1.1
第1个参数是float64类型,值是2.3
第2个参数是int类型,值是30     
第3个参数是string类型,值是tom 
第4个参数是string类型,值是北京
第5个参数是int类型,值是3000   
相关推荐
AI原吾39 分钟前
掌握Python-uinput:打造你的输入设备控制大师
开发语言·python·apython-uinput
机器视觉知识推荐、就业指导39 分钟前
Qt/C++事件过滤器与控件响应重写的使用、场景的不同
开发语言·数据库·c++·qt
毕设木哥41 分钟前
25届计算机专业毕设选题推荐-基于python的二手电子设备交易平台【源码+文档+讲解】
开发语言·python·计算机·django·毕业设计·课程设计·毕设
珞瑜·41 分钟前
Matlab R2024B软件安装教程
开发语言·matlab
weixin_4554461742 分钟前
Python学习的主要知识框架
开发语言·python·学习
孤寂大仙v1 小时前
【C++】STL----list常见用法
开发语言·c++·list
她似晚风般温柔7892 小时前
Uniapp + Vue3 + Vite +Uview + Pinia 分商家实现购物车功能(最新附源码保姆级)
开发语言·javascript·uni-app
咩咩大主教2 小时前
C++基于select和epoll的TCP服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·io多路复用
FuLLovers2 小时前
2024-09-13 冯诺依曼体系结构 OS管理 进程
linux·开发语言
王中阳Go2 小时前
字节跳动的微服务独家面经
微服务·面试·golang