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的 ...
随机推荐
- bzoj 4530: [Bjoi2014]大融合【LCT】
新姿势,一般来讲LCT只能维护splay重边里的数据,而这里要求维护整颗子树的size 多维护一个sq表示当前点轻儿子的size和,si表示包括轻重边的整颗子树的大小 然后需要改sq的地方是link和 ...
- 11.6NOIP模拟赛
[数据规模和限制] 对于全部测试数据,满足 N,M,K≤,W≤ 各个测试点的数据规模及特殊性质如下表. 测试点 N M K ≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤ 师 更多咨询:北京信息学窦老师 QQ ...
- 大数据系列文章-Hadoop的HDFS读写流程(二)
在介绍HDFS读写流程时,先介绍下Block副本放置策略. Block副本放置策略 第一个副本:放置在上传文件的DataNode:如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点. 第二 ...
- 第02课 操作系统及Linux 系统介绍
1.操作系统介绍 操作系统(Operating System,简称OS),是计算机系统中必不可少的基础系统软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统的核心. 操作系统的作用是管 ...
- php的iconv函数中utf8与utf-8的差异
开发中遇到一个奇怪的问题:报错如下: iconv() [<a href='function.iconv'>function.iconv</a>] : Wrong charset ...
- 动手实现 Redux(六):Redux 总结
不知不觉地,到这里大家不仅仅已经掌握了 Redux,而且还自己动手写了一个 Redux.我们从一个非常原始的代码开始,不停地在发现问题.解决问题.优化代码的过程中进行推演,最后把 Redux 模式自己 ...
- Java_面向对象中的this和super用法
this: 1.使用在类中,可以用来修饰属性.方法.构造器 2.表示当前对象或者是当前正在创建的对象 3.当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加 this 来表明该变量时类成 ...
- CF782B The Meeting Place Cannot Be Changed
题意: The main road in Bytecity is a straight line from south to north. Conveniently, there are coordi ...
- 如何在win7、win8、win8.1上安装使用vb6.0
https://jingyan.baidu.com/article/915fc414fdf8fb51384b2062.html如何在win7.win8.win8.1上安装使用vb6.0 如何在win7 ...
- Linux服务器用iotop命令分析服务器磁盘IO情况
Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦.如果会systemtap, 或者blktrace这些事情 ...