一、基本介绍

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

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

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:类型断言的更多相关文章

  1. GO语言总结(5)——类型转换和类型断言

    上一篇博客介绍了Go语言的数组和切片——GO语言总结(4)——映射(Map),本篇博客介绍Go语言的类型转换和类型断言 由于Go语言不允许隐式类型转换.而类型转换和类型断言的本质,就是把一个类型转换到 ...

  2. Go的类型断言解析

    经常地我们对一个接口值的动态类型是不确定的,如方法的形参为接口类型时,此时就需要检验它是否符合我们需要的类型.类型断言是一个使用在接口值上的操作.断言类型的语法:x.(T),这里x表示一个接口的类型, ...

  3. golang 类型断言的学习

    在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在gola ...

  4. golang类型断言

    一.介绍 类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言 例子: package main import "fmt" func main(){ ...

  5. [Go] golang类型断言

    类型断言有点像向下转型,接口类型转到具体的实现实例类型上类型断言是一个使用在接口值上的操作.语法上它看起来像x.(T)被称为断言类型,这里x表示一个接口的类型和T表示一个类型 package main ...

  6. Golang的类型断言

    类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式: y, ok := x.(type) 上面的语句用于判断变量x是不是type类型,有两种结果: x是type类型的变 ...

  7. go语言之进阶篇通过switch实现类型断言

    1.通过switch实现类型断言 示例: package main import "fmt" type Student struct { name string id int } ...

  8. go语言之进阶篇通过if实现类型断言

    1.通过if实现类型断言 示例: package main import "fmt" type Student struct { name string id int } func ...

  9. Go语言的类型转换和类型断言

    https://my.oschina.net/chai2010/blog/161418 https://studygolang.com/articles/9335  类型转换.类型断言和类型切换 ht ...

  10. Go 的类型断言type assertion

    Go语言中的类型断言,语法上是这样的: x.(T) 其中,x是interface接口的表达式,T是类型,称为被断言类型. 补充一下,接口有接口值的概念,其包括动态类型和动态值两部分. 类型断言根据T的 ...

随机推荐

  1. tcpdump笔记

    最好的学习: man tcpdump ....... 一.TCPdump抓包命令  tcpdump是一个用于截取网络分组,并输出分组内容的工具.tcpdump凭借强大的功能和灵活的截取策略,使其成为类 ...

  2. AtCoder Grand Contest 001 D - Arrays and Palindrome

    题目传送门:https://agc001.contest.atcoder.jp/tasks/agc001_d 题目大意: 现要求你构造两个序列\(a,b\),满足: \(a\)序列中数字总和为\(N\ ...

  3. Codeforces Round #261 (Div. 2) C

    Description Recently Pashmak has been employed in a transportation company. The company has kbuses a ...

  4. Salazar Slytherin's Locket CodeForces - 855E

    Salazar Slytherin's Locket CodeForces - 855E http://www.cnblogs.com/ftae/p/7590187.html 数位dp: http:/ ...

  5. h5-22-地理位置

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 解决IDEA Tomcat控制台乱码问题

    1.在Tomcat Server的配置中添加一句命令: 神秘代码: -Dfile.encoding=UTF-8 重启Tomcat,ok. 如果还不行,则需要: 1.在Settings中修改文件编码 2 ...

  7. hash系列集合的性能优化

    hash系列的集合: HashSet.LinkedHashSet     采用hash算法决定元素在集合中的存储位置 HashMap.LinkedHashMap.Hashtable   采用hash算 ...

  8. spring-bean(三)

    配置方式:通过工厂方法配置bean,通过FactoryBean配置bean 配置形式:基于注解的方式 组件扫描 泛型依赖注入 静态工厂方法 /** * 静态工厂方法:直接调用某一个类的静态方法就可以返 ...

  9. 洛谷P2763 试题库问题(最大流)

    题意 $n$道试题,每道题有多种类别属性 抽取$m$道题组成试卷,要求包含指定的类型 输出方案 Sol 又是一道zz网络流 我的构图长这样,$k_i$表示第$i$道试题需要的数量 #include&l ...

  10. findFile的用法

    ===============================================   @echo off   echo **No Options:   for /f %%a in (&q ...