Golang 类型断言的具体使用
作者:别抢我的辣条~ 时间:2024-05-13 10:45:23
一,如何检测和转换接口变量的类型
在Go语言的interface中可以是任何类型,所以Go给出了类型断言来判断某一时刻接口中所含有的类型,例如现在给出一个接口,名为InterfaceText:
x,err:=interfaceText.(T)//T是某一种类型
上式是接口断言的一般形式,因为此方法不一定每次都可以完好运行,所以err的作用就是判断是否出错。所以一般接口断言常用以下写法:
if v,err:=InterfaceText.(T);err {//T是一种类型
possess(v)//处理v
return
}
如果转换合法,则v为InterfaceText转换为类型T的值,err为ture,反之err为false。
值得注意的是:InterfaceText必须是接口类型!!!
有些时候若是想仅判断是否含有类型T,可以写为:
if _,err:=InterfaceText.(T);err{
//..
return
}
下面给出一个具体的例子帮助理解:
package main
import (
"fmt"
"math"
)
type Square struct{
slide float32
}
type Circle struct{
radius float32
}
type Figure interface{
Area() float32
}
func main(){
var fi Figure
sq:=new(Square)
sq.slide=5
fi=sq
if v,err:=fi.(*Square);err {
fmt.Printf("fi contain a variable of type : %v\n",v)
}else {
fmt.Println("fi does not contain a variable of Square")
}
if v2,ok:=fi.(*Circle);ok {
fmt.Printf("fi contain a variable of type : %v\n",v2)
}else {
fmt.Println("fi does not contain a variable of Circle")
}
}
func (s *Square) Area() float32{
return s.slide*s.slide
}
func (c *Circle) Area() float32{
return c.radius*c.radius*math.Pi
}
运行结果:
二,类型判断:type-switch
这是另一种类型判断的方法,此方法和switch很相似。直接看代码:
switch x:=InterfaceText.(type) {
case *Square:
fmt.Printf("text:%v",i)
case *Circle:
//..
case nil:
//..
default:
//..
//..and so forth
}
理解思路和switch很相似,如果InterfaceText中有*Square,*Circle,nil三种类型,就会执行对应的代码,若都没有,便会执行default里的代码。
如果仅判断,而不使用值的话可以写为:
switch InterfaceText.(type) {
case *Square:
fmt.Printf("text:%v",i)
case *Circle:
//..
case nil:
//..
default:
//..
//..and so forth
}
有时为了方便,我们可以把它打包成一个函数来判断一些未知类型:
func classify(items...interface{}){
for i,x:=range items {
switch x.(type) {
case bool:
fmt.Printf("text:%v",i)
case int:
//..
case float32:
//..
default:
//..
//..and so forth
}
}
}
可以这样调用此方法:classifier(13, -14.3, false) 。
当然也可以加入其他类型,这个看具体情况而定。
来源:https://blog.csdn.net/m0_63901241/article/details/125394595
标签:Golang,类型断言
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
如何在Access 2007数据库中添加附件
2008-11-21 12:32:00
Python字符串大小写转换拼接删除空白
2023-01-24 13:08:01
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
2024-05-11 09:16:42
![](https://img.aspxhome.com/file/2023/9/126379_0s.jpg)
python实现批处理文件
2022-08-14 19:27:46
Python-pip配置国内镜像源的安装方式
2023-08-22 21:55:38
![](https://img.aspxhome.com/file/2023/6/93696_0s.png)
Python3实现的回文数判断及罗马数字转整数算法示例
2023-07-07 05:10:06
Python 3.6 中使用pdfminer解析pdf文件的实现
2023-09-02 08:34:08
![](https://img.aspxhome.com/file/2023/3/92183_0s.png)
详解Pandas 处理缺失值指令大全
2022-06-20 07:15:23
sql server海量数据库的查询优化及分页算法方案
2010-07-02 21:17:00
python并发编程多进程 模拟抢票实现过程
2022-03-07 11:53:05
Python异步操作MySQL示例【使用aiomysql】
2024-01-16 20:22:07
Django实现自定义404,500页面教程
2021-06-20 06:23:07
python不同版本的_new_不同点总结
2023-09-21 15:36:45
MySQL MEM_ROOT详解及实例代码
2024-01-15 13:42:54
![](https://img.aspxhome.com/file/2023/9/71099_0s.jpg)
Python实现批量下载音效素材详解
2021-09-19 02:08:27
![](https://img.aspxhome.com/file/2023/5/134885_0s.png)
PHP实时统计中文字数和区别
2023-07-13 10:44:01
自动生成文章摘要的代码[JavaScript 版本]
2024-04-30 09:52:16
MySQL使用IF语句及用case语句对条件并结果进行判断
2024-01-14 14:30:27
![](https://img.aspxhome.com/file/2023/3/128423_0s.png)
python一行sql太长折成多行并且有多个参数的方法
2022-06-21 03:47:04
python计算机视觉opencv卡号识别示例详解
2023-04-14 13:58:25
![](https://img.aspxhome.com/file/2023/6/105306_0s.png)