Golang 类型断言的具体使用

 更新时间:2023年03月08日 10:41:07   作者:别抢我的辣条~  
本文主要介绍了Golang 类型断言的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一,如何检测和转换接口变量的类型

在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) 。

当然也可以加入其他类型,这个看具体情况而定。

到此这篇关于Golang 类型断言的具体使用的文章就介绍到这了,更多相关Golang 类型断言内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang中Map按照Value大小排序的方法实例

    Golang中Map按照Value大小排序的方法实例

    这篇文章主要给大家介绍了关于Golang中Map按照Value大小排序的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • go语言生成随机数和随机字符串的实现方法

    go语言生成随机数和随机字符串的实现方法

    随机数在很多时候都可以用到,尤其是登录时,本文就详细的介绍一下go语言生成随机数和随机字符串的实现方法,具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • Golang切片Slice功能操作详情

    Golang切片Slice功能操作详情

    这篇文章主要介绍了Golang切片功能操作详情,切片是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封,切片是一个引用类型,它的内部结构包含地址、长度和容量
    2022-09-09
  • golang占位符%v、%+v、%#v举例详解

    golang占位符%v、%+v、%#v举例详解

    这篇文章主要给大家介绍了关于golang占位符%v、%+v、%#v的相关资料,Go语言中的占位符通常用于格式化输出,它们以%开头,后跟一个字符,表示要转换的数据类型,需要的朋友可以参考下
    2024-05-05
  • 一文深入探索Go语言中的循环结构

    一文深入探索Go语言中的循环结构

    在编程中,循环结构扮演着重要的角色,它使我们能够有效地重复执行特定的代码块,以实现各种任务和逻辑,在Go语言中,for 是 Go 中唯一的循环结构,本文将深入探讨Go语言中的for循环类型以及它们的用法
    2023-08-08
  • go语言中strings包的用法汇总

    go语言中strings包的用法汇总

    Golang语言 strings标准库包主要涉及字符串的基本操作,下面我们来详细分析下吧
    2018-10-10
  • Go log库的使用示例详解

    Go log库的使用示例详解

    Go语言内置的log库提供了基本的日志记录功能,支持日志的格式化输出、设置日志前缀、配置输出位置等,可以通过标准logger或创建新的Logger对象来使用,log库简单易用,但功能有限,可能需要配合第三方日志库如logrus、zap等来满足复杂需求
    2024-09-09
  • Golang 并发以及通道的使用方式

    Golang 并发以及通道的使用方式

    这篇文章主要介绍了Golang 并发以及通道的使用方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 深入理解gorm如何和数据库建立连接

    深入理解gorm如何和数据库建立连接

    这篇文章主要为大家详细介绍了gorm如何和数据库建立连接,文中的示例代码讲解详细,对我们深入了解GO语言有一定的帮助,需要的小伙伴可以参考下
    2023-11-11
  • Golang单元测试与断言编写流程详解

    Golang单元测试与断言编写流程详解

    这篇文章主要介绍了Golang单元测试与断言编写流程,单元测试也是一个很重要的事情。单元测试是指在开发中,对一个函数或模块的测试。其强调的是对单元进行测试
    2022-12-12

最新评论