go语言类型断言是啥

go语言中,类型断言是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接口或者具体的类型,语法为“value, ok := x.(T)”。通过类型断言可以做到的事情:1、检查i是否为nil;2、检查i存储的值是否为某个类型。

go语言类型断言是啥

本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

断言是什么?

断言是编程术语,表示为一些布尔表达。编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设。简单的来理解断言的话就是判断的意思。所以在Go中类型断言我们就可以理解成对类型的判断。

类型断言介绍

类型断言(Type Assertion)是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接口或者具体的类型。

在Go语言中类型断言的语法格式如下:

立即学习“go语言免费学习笔记(深入)”;

value, ok := x.(T)

登录后复制

其中,x 表示一个接口的类型,T 表示一个具体的类型(也可为接口类型)。

该断言表达式会返回 x 的值(也就是 value)和一个布尔值(也就是 ok),可根据该布尔值判断 x 是否为 T 类型:

如果 T 是具体某个类型,类型断言会检查 x 的动态类型是否等于具体类型 T。如果检查成功,类型断言返回的结果是 x 的动态值,其类型是 T。

如果 T 是接口类型,类型断言会检查 x 的动态类型是否满足 T。如果检查成功,x 的动态值不会被提取,返回值是一个类型为 T 的接口值。

无论 T 是什么类型,如果 x 是 nil 接口值,类型断言都会失败。

在Go中类型断言主要有两种形式

变量.(类型)。例如:i.(int)

变量,bool = 变量.(类型)。例如:num,ok = i.(int)。ok表示判断类型是否成功的意思。

类型断言的用法

通过类型断言可以做到以下几件事情

检查 i 是否为 nil

检查 i 存储的值是否为某个类型

具体的使用方式有两种:

第一种:

t := i.(T)

登录后复制

这个表达式可以断言一个接口对象(i)里不是 nil,并且接口对象(i)存储的值的类型是 T,如果断言成功,就会返回值给 t,如果断言失败,就会触发 panic。

来写段代码试验一下

package mainimport "fmt"func main() {    var i interface{} = 10    t1 := i.(int)    fmt.Println(t1)    fmt.Println("=====分隔线=====")    t2 := i.(string)    fmt.Println(t2)}

登录后复制

运行后输出如下,可以发现在执行第二次断言的时候失败了,并且触发了 panic

10=====分隔线=====panic: interface conversion: interface {} is int, not stringgoroutine 1 [running]:main.main()        E:/GoPlayer/src/main.go:12 +0x10eexit status 2

登录后复制

如果要断言的接口值是 nil,那我们来看看也是不是也如预期一样会触发panic

package mainfunc main() {    var i interface{} // nil    var _ = i.(interface{})}

登录后复制

输出如下,确实是会 触发 panic

panic: interface conversion: interface is nil, not interface {}goroutine 1 [running]:main.main()        E:/GoPlayer/src/main.go:5 +0x34exit status 2

登录后复制

第二种

t, ok:= i.(T)

登录后复制

和上面一样,这个表达式也是可以断言一个接口对象(i)里不是 nil,并且接口对象(i)存储的值的类型是 T,如果断言成功,就会返回其类型给 t,并且此时 ok 的值 为 true,表示断言成功。

如果接口值的类型,并不是我们所断言的 T,就会断言失败,但和第一种表达式不同的事,这个不会触发 panic,而是将 ok 的值设为 false ,表示断言失败,此时t 为 T 的零值。

稍微修改下上面的例子,如下

package mainimport "fmt"func main() {    var i interface{} = 10    t1, ok := i.(int)    fmt.Printf("%d-%t", t1, ok)    fmt.Println("=====分隔线1=====")    t2, ok := i.(string)    fmt.Printf("%s-%t", t2, ok)    fmt.Println("=====分隔线2=====")    var k interface{} // nil    t3, ok := k.(interface{})    fmt.Println(t3, "-", ok)    fmt.Println("=====分隔线3=====")    k = 10    t4, ok := k.(interface{})    fmt.Printf("%d-%t", t4, ok)    t5, ok := k.(int)    fmt.Printf("%d-%t", t5, ok)}

登录后复制

运行后输出如下,可以发现在执行第二次断言的时候,虽然失败了,但并没有触发了 panic。

10-true=====分隔线1=====-false=====分隔线2===== - false=====分隔线3=====10-true10-true

登录后复制

上面这段输出,你要注意的是第二个断言的输出在-false  之前并不是有没有输出任何 t2 的值,而是由于断言失败,所以 t2 得到的是 string 的零值也是 “” ,它是零长度的,所以你看不到其输出。

Type Switch

如果需要区分多种类型,可以使用 type switch 断言,这个将会比一个一个进行类型断言更简单、直接、高效。

package mainimport "fmt"func findType(i interface{}) {    switch x := i.(type) {    case int:        fmt.Println(x, "is int")    case string:        fmt.Println(x, "is string")    case nil:        fmt.Println(x, "is nil")    default:        fmt.Println(x, "not type matched")    }}func main() {    findType(10)      // int    findType("hello") // string    var k interface{} // nil    findType(k)    findType(10.23) //float64}

登录后复制

输出如下

10 is inthello is string is nil10.23 not type matched

登录后复制

额外说明一下:

如果你的值是 nil,那么匹配的是 case nil如果你的值在 switch-case 里并没有匹配对应的类型,那么走的是 default 分支

【相关推荐:Go视频教程、编程教学】

以上就是go语言类型断言是啥的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2415151.html

(0)
上一篇 2025年3月3日 00:52:44
下一篇 2025年2月26日 08:19:41

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Go语言error类型是什么

    在Go语言,error是一个接口类型。error接口类型是作为错误处理的标准模式,如果函数要返回错误,则返回值类型列表中肯定包含error;error处理过程类似于C语言中的错误码,可逐层返回,直到被处理。error接口类型定义为仅包含一个…

    2025年3月3日
    200
  • golang格式化占位符有哪些

    go格式化占位符可分为:1、普通占位符,包括“%v”、“%+v”、“%#v”、“%T”等;2、布尔占位符“%t”;3、整数占位符,包括“%b”、“%c”、“%d”、“%o”等;4、浮点数和复数占位符,包括“%b”、“%e”、“%E”、“%f…

    2025年3月3日
    200
  • go语言怎么截取字符串

    截取方法:1、截取单个字符,语法“string[index]”,其中“string”表示源字符串,“index”表示要获取的字符下标;2、截取子串,语法“string[start : end]”,其中“start”表示要截取的第一个字符所在…

    2025年3月3日 编程技术
    200
  • Go语言字符串怎么转为数组

    转换方法:1、用Fields()按空格分割字符串转为数组,语法“arr := strings.Fields(s)”;2、用Split()按字符串分割字符串,语法“arr := strings.Split(s,sep)”;3、用FieldsF…

    2025年3月3日 编程技术
    200
  • golang中有没有类

    golang中没有类。golang不是一门纯面向对象编程语言,它没有class(类)的概念,也就没有继承的说法,但Go也可以模拟面向对象的编程方式。在Go中,可以将struct比作其它语言中的class;通过struct定义结构体,表征一类…

    2025年3月3日
    200
  • golang支持跨平台吗

    golang支持跨平台。由于其模块化设计和模块化,即代码被编译并转换为尽可能小的二进制形式,因此,golang不需要依赖性;它的代码可以在任何平台上编译,也可以在任何服务器和应用程序上编译。而且Go语言拥有自己的链接器,不依赖任何系统提供的…

    2025年3月3日
    200
  • golang怎么判断字符串是否以指定字符开头

    在golang中,可以使用strings包的HasPrefix()函数来判断字符串是否以指定字符或字符串开头,语法“Strings.HasPrefix(原字符串,要检索的子串)”;如果是以指定字符开头则返回True,如果不是则返回False…

    2025年3月3日
    200
  • golang怎么判断是否以指定字符结尾

    在golang中,可以使用strings包的HasSuffix()函数来判断字符串是否以指定字符或字符串结尾,语法“strings.HasSuffix(原字符串,要检索的子串)”;如果是以指定字符结尾则返回True,如果不是则返回False…

    2025年3月3日
    200
  • go语言怎么获取字符串长度

    获取方法:1、使用bytes.Count()获取长度,语法“bytes.Count([]byte(str), sep))”;2、使用strings.Count()获取长度,语法“strings.Count(str, substr)”;3、使…

    2025年3月3日 编程技术
    200
  • golang中map是什么

    在golang中,map是一种特殊的数据结构,是一个key(索引)和value(值)形式的无序的集合,也可以称为关联数组或字典;map是一种能够快速寻找值的理想结构,是能够快速根据给定key,找到对应的value的数据结构。 本教程操作环境…

    2025年3月3日
    200

发表回复

登录后才能评论