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
}

运行结果:

Golang 类型断言的具体使用

二,类型判断: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,类型断言
0
投稿

猜你喜欢

  • MySQL触发器trigger的使用

    2024-01-23 15:08:23
  • 解决python selenium3启动不了firefox的问题

    2022-12-02 11:36:34
  • 取numpy数组的某几行某几列方法

    2022-03-10 02:04:56
  • Python中的变量与常量

    2022-01-14 22:26:43
  • JavaScript table的排序类

    2008-10-06 12:56:00
  • Django中Forms的使用代码解析

    2022-03-20 08:06:56
  • pandas获取groupby分组里最大值所在的行方法

    2021-08-14 21:39:14
  • antd项目实现彩蛋效果的详细代码

    2023-09-14 12:51:20
  • MySQL数据库开启、关闭、查看函数功能的方法

    2024-01-20 00:41:13
  • IE6浮出层穿透解决方案中的iframe高度自适应

    2009-10-30 18:08:00
  • 浅析python 中大括号中括号小括号的区分

    2021-06-15 15:14:16
  • Python+django实现简单的文件上传

    2021-08-15 03:11:25
  • Python实现微信好友的数据分析

    2023-10-21 15:54:20
  • Pytorch之如何dropout避免过拟合

    2023-11-29 15:11:05
  • python使用webdriver爬取微信公众号

    2022-10-06 02:13:30
  • python 异常捕获详解流程

    2022-06-12 15:31:04
  • 一步一步教你创建SQL 2005计划任务应用图解教程

    2024-01-18 10:34:30
  • Python中的turtle画箭头,矩形,五角星

    2023-11-22 13:38:12
  • 记一次成功的sql注入入侵检测附带sql性能优化

    2011-09-30 11:29:39
  • 解析php获取字符串的编码格式的方法(函数)

    2023-10-02 22:26:49
  • asp之家 网络编程 m.aspxhome.com