golang类型断言
一、介绍
类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package main import "fmt" func main(){ var x interface {} var b2 float64 = 1.1 x = b2 //空接口,可以接收任意值 //类型断言 y := x.(float64) // y2 := x.(float32) //不匹配会报错 fmt.Printf( "type:%T 值:%v" ,y,y) // fmt.Printf("type:%T 值:%v",y2,y2) } ##结果#### type :float64 值:1.1 |
断言时带上检测机制,如果失败不报错
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package main import "fmt" func main(){ var x interface {} var b2 float64 = 1.1 x = b2 //空接口,可以接收任意值 //类型断言 if y,ok := x.(float32); ok { fmt.Printf( "type:%T 值:%v" ,y,y) } else { fmt.Println( "error!" ) } fmt.Println( "end" ) } ###结果#### error! end |
二、类型断言最佳实践
例子 一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | package main import "fmt" //定义一个usb接口 type Usb interface { //声明了两个没有实现的方法 Start() Stop() } type Phone struct { name string } //让 Phone 实现 Usb 接口的方法 func (p Phone) Start() { fmt.Println( "手机开始工作。。。" ) } func (p Phone) Stop() { fmt.Println( "手机停止工作。。。" ) } func (p Phone) Call() { fmt.Println( "手机 在打电话.." ) } type Camera struct { name string } //让 Camera 实现 Usb 接口的方法 func (c Camera) Start() { fmt.Println( "相机开始工作。。。" ) } func (c Camera) Stop() { fmt.Println( "相机停止工作。。。" ) } type Computer struct { } func (computer Computer) Working(usb Usb) { usb.Start() //如果 usb 是指向 Phone 结构体变量,则还需要调用 Call 方法 //类型断言 if phone, ok := usb.(Phone); ok { phone.Call() } usb.Stop() } func main() { //定义一个 Usb 接口数组,可以存放 Phone 和 Camera 的结构体变量 //这里就体现出多态数组 var usbArr [3]Usb usbArr[0] = Phone{ "vivo" } usbArr[1] = Phone{ "小米" } usbArr[2] = Camera{ "尼康" } //遍历 usbArr //Phone 还有一个特有的方法 call(),请遍历 Usb 数组,如果是 Phone 变量, //除了调用 Usb 接口声明的方法外,还需要调用 Phone 特有方法 call. =》类型断言 var computer Computer for _, v := range usbArr{ computer.Working(v) fmt.Println() } } ####结果#### 手机开始工作。。。 手机 在打电话.. 手机停止工作。。。 手机开始工作。。。 手机 在打电话.. 手机停止工作。。。 相机开始工作。。。 相机停止工作。。。 |
例子 二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package main import "fmt" //编写一个函数,判断输入参数的类型 func GetType(items... interface {}) { for index,x := range items { switch x.( type ) { case bool: fmt.Printf( "第%v个参数是bool类型,值是%v\n" ,index,x) case int: fmt.Printf( "第%v个参数是int类型,值是%v\n" ,index,x) case string: fmt.Printf( "第%v个参数是string类型,值是%v\n" ,index,x) default : fmt.Printf( "第%v个参数类型不是上面的,值是%v\n" ,index,x) } } } func main(){ var n1 int = 1 var n2 string = "dd" var n3 bool = false GetType(n1,n2,n3) } ###结果### 第0个参数是int类型,值是1 第1个参数是string类型,值是dd 第2个参数是bool类型,值是false |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!