Go:类型断言
一、基本介绍
类型断言:由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言。
如果希望将一个空接口类型重新转换成对应的类型,那么需要使用类型断言,能转换成功是因为这个空接口原先是指向这个类型的。
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结构体特有的方法Call
func (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)
}

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

Go:类型断言的更多相关文章
- GO语言总结(5)——类型转换和类型断言
上一篇博客介绍了Go语言的数组和切片——GO语言总结(4)——映射(Map),本篇博客介绍Go语言的类型转换和类型断言 由于Go语言不允许隐式类型转换.而类型转换和类型断言的本质,就是把一个类型转换到 ...
- Go的类型断言解析
经常地我们对一个接口值的动态类型是不确定的,如方法的形参为接口类型时,此时就需要检验它是否符合我们需要的类型.类型断言是一个使用在接口值上的操作.断言类型的语法:x.(T),这里x表示一个接口的类型, ...
- golang 类型断言的学习
在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在gola ...
- golang类型断言
一.介绍 类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言 例子: package main import "fmt" func main(){ ...
- [Go] golang类型断言
类型断言有点像向下转型,接口类型转到具体的实现实例类型上类型断言是一个使用在接口值上的操作.语法上它看起来像x.(T)被称为断言类型,这里x表示一个接口的类型和T表示一个类型 package main ...
- Golang的类型断言
类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式: y, ok := x.(type) 上面的语句用于判断变量x是不是type类型,有两种结果: x是type类型的变 ...
- go语言之进阶篇通过switch实现类型断言
1.通过switch实现类型断言 示例: package main import "fmt" type Student struct { name string id int } ...
- go语言之进阶篇通过if实现类型断言
1.通过if实现类型断言 示例: package main import "fmt" type Student struct { name string id int } func ...
- Go语言的类型转换和类型断言
https://my.oschina.net/chai2010/blog/161418 https://studygolang.com/articles/9335 类型转换.类型断言和类型切换 ht ...
- Go 的类型断言type assertion
Go语言中的类型断言,语法上是这样的: x.(T) 其中,x是interface接口的表达式,T是类型,称为被断言类型. 补充一下,接口有接口值的概念,其包括动态类型和动态值两部分. 类型断言根据T的 ...
随机推荐
- AppStore 审核拒绝原因记录
此文仅记录审核app被拒绝的原因 1.未提供充值功能,app中出现vip或者会员图标文字 被拒 解决,隐藏或取消该图标或文字 2.第三方登录,需要跳转到第三方app登录 被拒 解决,审核时隐藏第三方登 ...
- oj判题WA/RE怎么办
[转]POJ WA/RE指南 “POJ上头的题都是数学题”,也不知道是那个家伙胡诌的……但是POJ的要求就是算法通过了也不让你AC.下面本人就这560题的经验,浅谈一下WA/RE了怎么办. 以下内 ...
- DP+高精度 URAL 1036 Lucky Tickets
题目传送门 /* 题意:转换就是求n位数字,总和为s/2的方案数 DP+高精度:状态转移方程:dp[cur^1][k+j] = dp[cur^1][k+j] + dp[cur][k]; 高精度直接拿J ...
- oracle中的用户详解 【转】
oracle中的用户很多,也很令初学者费解.oracle中的帐户分为两类:一类是必需的帐户,一类是存储各种应用的帐户 用户名 密码 描述 ANONYMOUS ANONYMOUS 访问http的匿名 ...
- 分区表,磁盘概念和parted的使用
分区表,磁盘概念和parted的使用 登录陌生系统首先要做的事: 个人认为,首先得知道Linux版本的什么:cat /etc/issue df:查看磁盘的分区和数据的分配情况,类型(NFS,ext4. ...
- ASP.NET Core Action 读取流
以前mvc5 action可以直接使用 var stream = HttpContext.Current.Request.InputStream; 读取流,在Core中有所不同,可以使用以下方式读取 ...
- Jenkins视图使用--添加删除视图
job建立的特别多的时候,我们可能不太容易找到自己的某个job,这时,我们就可以在Jenkins中建立视图.job的视图类似于我们电脑上的文件夹.可以通过一些过滤规则,将已经建好的job过滤到视图中, ...
- MySQL系列:隐式类型转化可能带来的坑
在开发规范中,我们往往会要求研发避免在where条件中出现隐式类型转换,这么要求大概有以下两方面的原因: 隐式类型转换可能导致索引失效: 隐式类型转换可能产生非预期的结果. 注:这里说的是隐式类型转换 ...
- MSComDlg.CommonDialog服务器不能创建对象错误的解决
作者:朱金灿 来源:http://blog.csdn.net/clever101 在JavaScript中弹出打开文件对话框,代码如下: var fileOpenDlg = new ActiveXOb ...
- Android 友盟和微信的包冲突:Multiple dex files define Lcom/tencent/a/a/a/a/a;
最近App中有个需求是添加微信支付,就在微信技术官网 http://open.weixin.qq.com,查看一下文档,然后下载SDk,Demo.把SDK集成进项目. 照着微信的文档,把jar包和进来 ...