博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go:类型断言
阅读量:6546 次
发布时间:2019-06-24

本文共 2696 字,大约阅读时间需要 8 分钟。

一、基本介绍

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

如果希望将一个空接口类型重新转换成对应的类型,那么需要使用类型断言,能转换成功是因为这个空接口原先是指向这个类型的。

type Point struct {	x int	y int}func main() {	var a interface{}	var p = Point{1, 2}	a = p // 这是可以的	var b Point	//b = a // 这时不可以的,要使用断言,如下	b = a.(Point) // 这就是类型断言,表示看看能不能将 a 转换成 Point,再赋给 b	c := a.(Point)	fmt.Println(b) // {1 2}	fmt.Printf("c的类型=%T,值=%v", c, c) // c的类型=main.Point,值={1 2}}

二、带检测的类型断言

在进行类型断言时,如果类型不匹配,就会报 panic,因此在进行类型断言时,需要检测机制,如果成功就继续执行,否则不要报 panic。

type Point struct {	x int	y int}func main() {	var a interface{}	var p = Point{1, 2}	a = p	b, ok := a.(int) // 肯定转换失败的,如果是string,则 b 为空	if ok{		fmt.Println("转换成功")	} else {		fmt.Println("转换失败") // 转换失败	}	fmt.Println(b) // 0}

三、类型断言最佳实践

示例1:

type Usb interface {    Connect()    Disconnect()}type Phone struct {Name string}type Camera struct {Name string}func (p Phone) Connect() {fmt.Printf("%s连接中...\n", p.Name)}func (p Phone) Disconnect() {fmt.Printf("%s断开连接中...\n", p.Name)}func (c Camera) Connect() {fmt.Printf("%s连接中...\n", c.Name)}func (c Camera) Disconnect() {fmt.Printf("%s断开连接中...\n", c.Name)}// Phone结构体特有的方法Callfunc (p Phone) Call() {fmt.Printf("正在使用%s打电话,..\n", p.Name)}type Computer struct {}func (c Computer) Working(usb Usb) {    usb.Connect()    usb.Disconnect()    // 如果 usb 是指向 Phone 结构体变量,则还需要调用 Call 方法    phone, ok := usb.(Phone) // 类型断言    if ok {        phone.Call()    }}func main() {    // 定义一个 Usb 接口数组,可以存放 Phone 和 Camera 结构体的实例    var usbArr [2]Usb    usbArr[0] = Phone{"苹果"}    usbArr[1] = Camera{"尼康"}    var computer Computer    for _, v := range usbArr {        computer.Working(v)    }    fmt.Println()    fmt.Println(usbArr)}
View Code

示例2:

type Student struct {}func TypeJudge(args... interface{}) {    for i, v := range args {        switch v.(type) {            case int, int8, int16, int32, int64:                fmt.Printf("第%v个参数是 整数 类型,值是%v\n", i, v)            case float32:                fmt.Printf("第%v个参数是 float32 类型,值是%v\n", i, v)            case float64:                fmt.Printf("第%v个参数是 float64 类型,值是%v\n", i, v)            case bool:                fmt.Printf("第%v个参数是 bool 类型,值是%v\n", i, v)            case string:                fmt.Printf("第%v个参数是 string 类型,值是%v\n", i, v)            case Student:                fmt.Printf("第%v个参数是 Student 类型,值是%v\n", i, v)            case *Student:                fmt.Printf("第%v个参数是 *Student 类型,值是%v\n", i, v)            default:                fmt.Printf("第%v个参数的类型未知,值是%v\n", i, v)        }    }}func main() {    var a int = 1    var b float32 = 2.2    var c float64 = 3.3    var d bool = true    var e Student    var f *Student    TypeJudge(a, b, c, d, e, f)}
View Code

 

转载于:https://www.cnblogs.com/believepd/p/10945700.html

你可能感兴趣的文章
[直播一揽子]编码构思和套路
查看>>
[直播一揽子]x264参数的解释
查看>>
iOS学习之Objective-C 2.0 运行时系统编程
查看>>
Exchange2007-Exchange2010升级-06 数据库高可用组的创建
查看>>
phpHiveAdmin是如何通过Hive/Hadoop工作的
查看>>
双向链表内结点的删除(4)
查看>>
项目总结
查看>>
JSON字符串转成对象
查看>>
SaltStack 中ZMQ升级
查看>>
grep,egrep使用以及正则表达式的使用
查看>>
implode 和 explode
查看>>
exchange 2013 提示“HTTP 500内部服务器错误”
查看>>
Linux运维学习笔记之一:运维的原则和学习方法
查看>>
怎样使用原型设计中的组件样式功能
查看>>
python threading
查看>>
谷安天下2013年6月CISA考前辅导 第一季
查看>>
ARM程序规范
查看>>
我的友情链接
查看>>
Qt下的OpenGL 编程(8)文字、FPS、动画
查看>>
Android开发入门系列
查看>>