我的编程空间,编程开发者的网络收藏夹
学习永远不晚

go语言类型断言怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

go语言类型断言怎么使用

本篇内容主要讲解“go语言类型断言怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言类型断言怎么使用”吧!

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

断言是什么?

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

类型断言介绍

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

在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/class="lazy" data-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/class="lazy" data-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\n", t1, ok)    fmt.Println("=====分隔线1=====")    t2, ok := i.(string)    fmt.Printf("%s-%t\n", 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\n", t4, ok)    t5, ok := k.(int)    fmt.Printf("%d-%t\n", t5, ok)}

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

10-true=====分隔线1=====-false=====分隔线2=====<nil> - 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<nil> is nil10.23 not type matched

额外说明一下:

  • 如果你的值是 nil,那么匹配的是 case nil

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

到此,相信大家对“go语言类型断言怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

go语言类型断言怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

go语言类型断言怎么使用

本篇内容主要讲解“go语言类型断言怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言类型断言怎么使用”吧!在go语言中,类型断言是一个使用在接口值上的操作,用于检查接口类型变量所持有
2023-07-05

Go语言中interface类型怎么使用

今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Go语言中int
2023-07-06

GO语言查询类型断言的方法

这篇文章主要介绍“GO语言查询类型断言的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“GO语言查询类型断言的方法”文章能帮助大家解决问题。类型查询我们知道interface的变量里面可以存储任意
2023-06-30

TypeScript中的类型断言语法怎么使用

这篇文章主要介绍“TypeScript中的类型断言语法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“TypeScript中的类型断言语法怎么使用”文章能帮助大家解决问题。Typescript
2023-07-02

Go语言返回值类型推断与其他语言的比较

go 语言中的返回值类型推断允许编译器自动推断函数返回值类型,简化代码并减少错误。它与 python 的局部变量类型推断、c# 的显式类型声明和 java 的强制类型声明有着不同的特点。这种推断能够简化代码、提高可读性,但可能会影响复杂函数
Go语言返回值类型推断与其他语言的比较
2024-04-30

TypeScript函数和类型断言怎么使用

这篇文章主要介绍“TypeScript函数和类型断言怎么使用”,在日常操作中,相信很多人在TypeScript函数和类型断言怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”TypeScript函数和类型
2023-07-02

怎么使用Go语言反射获取类型属性

本篇内容主要讲解“怎么使用Go语言反射获取类型属性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Go语言反射获取类型属性”吧!reflect.StructField 和 reflect.
2023-07-02

go语言引用类型哪些

go语言引用类型包括切片、映射和通道。1、切片,是一种动态数组,它可以根据需要进行增加或减少长度;2、映射,是一种无序的键值对集合,也称为哈希表或字典。映射使用哈希函数将键映射到对应的值,以支持快速的查找和更新操作。;3、通道,是一种用于在
2023-07-31

Go语言接口类型怎么定义

今天小编给大家分享一下Go语言接口类型怎么定义的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。接口接口是用来定义行为的类型,定
2023-07-05

go语言怎么获取类型信息

在go语言中,可以通过反射来获取类型信息;只需要调用reflect包的TypeOf()函数即可。方法:1、使用“reflect.TypeOf()”函数取得指定变量的类型对象;2、使用Name()和Kind()获取类型对象的类型信息,语法“类型对象.Name()”和“类型对象.Kind()”。
2023-05-14

Golang类型断言如何使用

这篇文章主要介绍了Golang类型断言如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang类型断言如何使用文章都会有所收获,下面我们一起来看看吧。一,如何检测和转换接口变量的类型在Go语言的int
2023-07-05

Go语言error类型有什么作用

本篇内容主要讲解“Go语言error类型有什么作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言error类型有什么作用”吧!在Go语言,error是一个接口类型。error接口类型是作
2023-07-05

Go语言特点及基本数据类型怎么使用

这篇文章主要介绍“Go语言特点及基本数据类型怎么使用”,在日常操作中,相信很多人在Go语言特点及基本数据类型怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言特点及基本数据类型怎么使用”的疑惑有所
2023-06-29

使用Go语言编写什么类型的程序?

go 语言可用于编写各种类型的应用程序,例如网络应用程序(web 服务器、api、微服务)、命令行工具(系统管理脚本、数据处理程序、测试工具)和并发应用程序(分布式系统、消息队列、数据流处理程序)。使用 Go 编程语言编写各种类型的程序G
使用Go语言编写什么类型的程序?
2024-04-03

Go语言函数返回值类型推断机制

go 语言中的函数返回值类型可以通过显式声明或编译器推导获得。推导规则包括:无显式返回为 "void"、单一返回语句为返回表达式的类型、多个返回语句为所有返回表达式的最大类型。推导机制简化了代码,提高了可读性,有助于正确使用该功能。Go语言
Go语言函数返回值类型推断机制
2024-04-30

go语言有哪些类型

go语言的类型有布尔型(bool)、整型(int8、byte、int16等)、浮点型(float32、float64)、复数类型(complex64、complex128)、字符串、字符型、错误型、指针、数组、切片、字典、通道、结构体、接口。浮点类型采用IEEE-754标准的表达方式;复数实际上由两个实数(在计算机中用浮点数表示)构成,一个表示实部,一个表示虚部。
2023-05-14

go语言类型有哪些

go语言类型有布尔类型、整数类型、浮点数类型、字符串类型、数组类型、切片类型、结构体类型、字典类型、函数类型等。详细介绍:1、布尔类型只有两个值,即true和false;2、整数类型包括int8、int16、int32、int64和相应的无
2023-07-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录