Go 类型转换、类型断言与类型选择
文章目录
- 1.类型转换
- 2.类型断言
- 3.类型选择
- 参考文献
Go 是一种静态类型的编译型语言,每一个变量在使用时都有明确的类型与之对应。Go 中,关于数据类型,主要有三点容易让人迷惑,分别是类型转换、类型断言和类型选择,下面分别讲解,并给出相应示例。
1.类型转换
Go 中不同类型变量间进行赋值是不允许的,即编译时会出现编译错误。Go 语言崇尚“显式表达,避免隐含”的设计思想,不允许隐式类型转换,因此相互兼容的不同类型间的赋值需要开发人员进行类型转换操作。类型转换语法格式如下:
<结果类型变量>:=<目标类型>(<表达式>)
参考如下示例:
package mainimport "fmt"func main(){var var1 float32 = 4.4fmt.Printf("%T->%v\n", var1, var1)var2 := float64(var1)var3 := int32(var1)fmt.Printf("%T->%v\n", var2, var2)fmt.Printf("%T->%v\n", var3, var3)//var4 := []byte(var1) //cannot convert var1 (type float32) to type []byte
}
程序输出:
float32->4.4
float64->4.400000095367432
int32->4
需要注意两点:
(1)当类型不兼容的时候是无法转换的,比如上例中的var4 := []byte(var1)
会报编译错误;
(2)非数值间相互转换不会丢失精度,数值间相互转换就需要考虑精度可能丢失的情况。比如上例中将float32转为int32,将丢失小数点后的小数部分。
2.类型断言
在处理由外部传入的数据时,想要创建一个通用函数在进行面向对象编程时,我们需要使用 interface{} 类型,即空接口类型。由于空接口类型中不包含任何方法,所以 Go 中的所有类型都实现了 interface{}。我们可以使用类型断言将一个 interface{} 类型的值转换为实际数据的值,即类型断言接受一个接口值, 并从中提取指定的明确类型的值。
使用类型断言有以下两种方式:
// 安全类型断言,失败 value 则为类型 T 的零值
value, ok := expression.(T) // 非安全类型断言,失败时会 panic
value := expression.(T)
使用示例:
func main() {var a interface{} = 1var b interface{} = "abc"c,ok := a.(int)d := b.(string)fmt.Println(c, ok)fmt.Println(d)
}
输出结果:
1 true
abc
3.类型选择
通过 interface{} 接收的变量类型可能有多种,此时我们需要进行类型选择,即使用 switch 配合类型选择,分发到具体情况(case)进行处理。
参考如下示例:
package mainimport "fmt"func main(){var b bool=truevar f64 float64=4.4var str string="dablelv"var i int=4var slice []byteclassifier(b,f64,str,i,slice)
}func classifier(items ...interface{}){for i,v := range items {switch v.(type) {case bool:fmt.Printf("index=#%d value=%v is bool\n",i,v)case float64:fmt.Printf("index=#%d value=%v is float64\n",i,v)case string:fmt.Printf("index=#%d value=%v is string\n",i,v)case int:fmt.Printf("index=#%d value=%v is int\n",i,v)default:fmt.Printf("index=#%d value=%v is %T\n",i,v,v)}}
}
输出结果:
index=#0 value=true is bool
index=#1 value=4.4 is float64
index=#2 value=dablelv is string
index=#3 value=4 is int
index=#4 value=[] is []uint8
参考文献
[1] Go编程语言.实效Go编程
[2] Go语言 类型转换,类型断言,类型开关
Go 类型转换、类型断言与类型选择相关推荐
- Go 学习笔记(35)— Go 接口 interface (接口声明、接口初始化、接口方法调用、接口运算、类型断言、类型查询、空接口)
1. 接口概念 接口是双方约定的一种合作协议.接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节.接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式.类型及结构. 接口内部存 ...
- channel 管道 接收和输出数据 使用类型断言进行类型的转换
首先定义一个Cat结构体 import ("fmt" )type Cat struct {Name stringAge int } 因为接受的都是空接口类型,所以在输出的时候如果按 ...
- 类型转换与类型断言之间的区别
搜罗了一下类型转换与类型断言之间的区别,还有类型断言一个返回值与两个返回值之间的区别 1.类型转换(1).语法:<结果类型> := <目标类型> ( <表达式> ) ...
- TypeScript中的联合类型、类型别名、接口、类型断言
一.联合类型 在TypeScript中,联合类型(Union Types)是指用"|"符号将多个类型组合成一个的类型.这种类型可以包含不同的类型,例如字符串.数字或对象.这些不同类 ...
- 【TypeScript专题】之类型断言
[TypeScript 专题]之类型断言 断言是编程术语,表示为一些布尔表达.-- 百度百科 系列文章,收藏不走丢哦 类型断言(Type Assertion)可以用来手动指定一个值的类型.就是告诉编译 ...
- golang类型断言的使用(Type Assertion)
第一部分 首先,转自https://studygolang.com/articles/3314对断言的基本介绍 golang的语言中提供了断言的功能.golang中的所有程序都实现了interface ...
- typescript 数据类型、函数返回值、类型断言、联合类型、类型兼容
null和undefined类型:是所有类型的子类型,即可以将任意类型赋值为二者any类型:可以赋值任何类型unknown类型:引入的顶级类型unknown,对照于any,unknown是类型安全的, ...
- golang: 类型转换和类型断言
类型转换在程序设计中都是不可避免的问题.当然有一些语言将这个过程给模糊了,大多数时候开发者并不需要去关注这方面的问题.但是golang中的类型匹配是很严格的,不同的类型之间通常需要手动转换,编译器不会 ...
- TypeScript的类型断言,有点像ABAP的强制类型转换
通过类型断言这种方式可以告诉编译器,"相信我,我知道自己在干什么". 类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构. 它没有运行时的影响,只是在编译阶段起作用. ...
最新文章
- 今晚 8 点直播 | OpenCV 20 年,首款开源软硬一体的 OAK 套件来了!
- 陪伴程序员的一条龙、一骑士 36 岁了!
- oracle视图的同义词,oracle 视图、同义词、序列
- C++中字符型和整型的关系
- python段子_Python爬取内涵段子里的段子
- 【clickhouse】Code: 135. DB::Exception: Received from xxx:9000. DB::Exception: Indices in strings are
- HappyAA服务器部署笔记1(nginx+tomcat的安装与配置)
- java ajax动态加载数据_java实现的highcharts与ajax结合动态实时获取数据更新图表
- 有关PyCharm的破解安装
- CSDN Markdown 图片排版显示
- 用java设计族谱家谱制_家谱网站的设计与实现.doc
- 计算机高级培训教师感言,教师信息技术培训感言信息技术培训心得多篇.docx
- 了解交换机、路由器、网关的概念以及它们各自属于什么层次?
- 安卓libc setenv函数内存泄漏
- PowerShell的基本使用方法
- idea 安装vue.js插件
- 为listview、或者recyclerView的item增加进场动画
- 2012 ACM 亚洲区总结帖
- 7-1 立方体类的实现 (20分)
- Git安装(Msysgit)