一、基本介绍

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

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

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. SVG动画 -- 描边动画

    代码说明:纯CSS实现,无JS <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  2. 7天学完Java基础之1/7

    方法重载 package cn.itcat.day04.demo01; //方法重载就是参数个数不同,参数类型不同,参数类型的顺序不同 //方法重载与参数名称无关,与方法返回值类型无关 //方法重载方 ...

  3. Django models数据库配置以及多数据库调用设置

    今天来说说web框架Django怎么配置使用数据库,也就是传说中MVC(Model View Controller)中的M,Model(模型). 简单介绍一下Django中的MVC: 模型(model ...

  4. C/C++ 动态库so的生成与调用

    1. Linux-(C/C++)动态链接库生成以及使用(libxxx.so) 2. C++文件如何在linux下生成动态库So,以及如何使用这个动态库 3. c++ 发布动态.so 简记1. 编译生成 ...

  5. 网络流24题 一句话题解(updating)

      搭配飞行员问题   最简单的一道题 就是一个二分图匹配   太空飞行计划   最大权闭合子图 什么叫"最大权闭合子图"呢? 就是给定一个有向图,在里面选择一个点集,使得点集中的 ...

  6. AtCoder Grand Contest 013 E - Placing Squares

    题目传送门:https://agc013.contest.atcoder.jp/tasks/agc013_e 题目大意: 给定一个长度为\(n\)的木板,木板上有\(m\)个标记点,距离木板左端点的距 ...

  7. FZu Problem 2236 第十四个目标 (线段树 + dp)

    题目链接: FZu  Problem 2236 第十四个目标 题目描述: 给出一个n个数的序列,问这个序列内严格递增序列有多少个?不要求连续 解题思路: 又遇到了用线段树来优化dp的题目,线段树节点里 ...

  8. 哈密顿图 BestCoder Round #53 (div.2) 1003 Rikka with Graph II

    题目传送门 题意:判断是否为哈密顿图 分析:首先一种情况是不合法的:也就是度数为1的点超过2个:合法的有:,那么从度数为1的点开始深搜,如果存在一种走法能够走完n个点那么存在哈密顿路 收获:学习资料 ...

  9. [已读]HTML5与CSS3权威指南第二版(下)

    去年下半年前公司给买的(老付对我们确实蛮好的),一人挑一本,我当时一定是秀逗了.看的时候就发现,这本书的内容过时严重,即便它是新出不久的第.二.版.其他没什么说的,总之,不推荐看.

  10. Hadoop工作流概念学习系列总述(一)

    不多说,这里,直接上干货!从这篇博客起,逐步分享如下: 1.工作流 2.Hadoop工作流(内置) 3.第三方框架--Azkaban(推荐外安装)