广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang断言判断值类型的实现方法
  • 760
分享到

Golang断言判断值类型的实现方法

2024-04-02 19:04:59 760人浏览 泡泡鱼
摘要

golang可以通过断言,判断值的类型 s:="hello world" i:=interface{}(s)//将数值转化为interface空接口类型 //需要注意的是,必须是

golang可以通过断言,判断值的类型


s:="hello world"
i:=interface{}(s)//将数值转化为interface空接口类型
//需要注意的是,必须是空接口类型才能使用断言,如果不是空接口类型会报错
//Invalid type assertion: a.(string) (non-interface type string on left)
v,e:=i.(string)//返回value和error值,当err值为true则转化成功,value的值为括号中的值类型,当err值为false,则转化不成功

也可以通过反射判断值的类型


name:="test"
t:=relfect.TypeOf(name)
fmt.Println(t)//通过反射确定值的类型

类型断言是什么,类型断言和类型转换有什么区别,这个问题以前我也常常分不清楚。为了帮助和我有一样疑问的人,我决定得写一篇关于这方面的博文,介绍一下Golang中的类型断言和类型转换的区别,在javascript的超集typescript里,也同样有类型断言的概念。这篇简短的博文就是帮助大家解答这个疑问,我会尽量短的说清楚,我理解的类型转换和类型断言的区别是什么。

什么是类型转换

类型转换在很多静态类型的语言中都会有的概念,类型转换通常分为显示类型转换和隐式类型转换。强制类型转换形如:


f := 11.22
i := int(f)

例如有个float32的变量被赋值为11.22,现在我们想去掉小数部分,最简单的方法就是将float32转换为int32。

简单来说,强制类型转换就是你要从一个类型强制转换到另一个类型。适用于一些基本类型,比如int, float之类等等。但在golang中,类型匹配是相当严格的,很多时候编译器不会帮你去做,所以大多数的情况下,我们还是会做一些显示的类型转换。

比如这段看起来在其它静态类型语言中毫无问题的代码片段,在golang中编译期就会报错,golang会强制让你做类型转换。


var i int = 1
var f float64 = i

接下来看看隐式的类型转换。golang中的隐式类型转换主要存在于运行时。比如:


var w io.Writer = os.Stdout

这里将*File类型赋值给了io.Writer类型,在运行时会做一个隐式的类型转换。

什么是断言

在了解什么是类型断言之前,先来了解一下断言是什么

这是尼克杨吗?

简而言之,断言就是对一种条件进行假设,如果这是尼克杨,那么我要要干嘛?如果这不是尼克杨又怎样?
随之,类型断言就是对类型进行一种假设。

这里拿Typescript来说个事,在TS里我们很多时候会用到一种类型叫联合类型,联合类型A | B可以理解为它可以是A类型或者是B类型。实际例子:


let zhangsan:Student | null //表示zhangsan是一个Student或者null类型

我们需要使用zhangsan的时候,可以使用类型断言


if(zhangsan) zs = <Student>zhangsan
//或者
if(zhangsan) zs = zhangsan as Student

在golang中的类型断言和Typescript中的第二种类型断言比较相像。在golang中形如


x.(T)

x是一种接口类型,T可以是一种具体的类型也可以是一种接口类型

golang为什么需要类型断言

为此,我们思考一个问题,为什么Golang需要类型断言,golang中对类型的要求十分严格,而且golang中也没有Typescript中的联合类型,好像一切类型都是固定不变的,有了强制转换类型,为什么还需要类型断言呢?

在Golang中,接口类型是能够隐式转换的。看一个具体的例子:


var w io.Writer = os.Stdout

w的类型为io.Writer,但是它被赋值了*File,这是Golang帮助我们做了一次类型转换。这次类型转换是在运行时的,编译时并不能确定下来。在运行时,这个接口值的类型被赋值为了*File,与此同时,值也被赋值为了os.Stdout。

上述说明了一个问题,接口值的类型是不固定的!因为它的类型是要在运行时才能确定下来,这需要看它的动态值的类型才能确定。这就是需要类型断言的原因了。

再看一个具体的例子


var w io.Writer = os.Stdout

这条语句执行过后,w只会拥有write方法,但是原本的*File不止拥有write方法,应该还拥有read方法,同时,它也是io.ReadWriter接口的一个实例。如果这时候我们想使用read方法怎么办,那就需要类型断言了。


rw := w.(io.ReadWriter)

这里将w断言为ReadWriter类型。断言类型为一个接口。暴露了*File的read和write方法

类型断言的检查机制是怎样的

于是我们想了解Golang的类型断言的检查机制是怎样的,换句话说,Golang到底是如何来判断断言是否成功的。

首先明确的是x必须为一个接口类型,而T可以是一个具体的类型也可以是一个接口类型。下面我们分情况讨论。

1.当T为一个接口类型时

当T为一个接口时,首先会判断x的动态值是否符合T这个接口,如果符合的话,断言成功,反之断言失败,断言失败时会抛出一个panic异常。但是如果类型断言出现在一个预期有两个结果的赋值操作中,那么断言失败不会抛出panic异常,而是用一个bool值标识是否断言成功。


var w io.Writer = os.Stdout 
b, ok := w.(*bytes.Buffer) 

为了健壮性,我们应该对ok返回的结果进行处理。标识是否断言成功。


var w io.Writer = os.Stdout 
if b, ok := w.(*bytes.Buffer);!ok {
  fmt.Fprintf(os.Stderr, "断言失败")
} else {
  //TODO
}

对一个接口类型的类型断言改变了类型的表述方式,改变了可以获取的方法集合(通常更大),但是它保护了接口值内部的动态类型和值的部分(Go Programing Language)

当T为一个具体类型时

当T为一个具体类型时,会先检查x的动态值的类型是否为T,如果为T则断言成功,如果不为T,则断言失败。

具体类型的类型断言从它的操作对象中获得具体的值(Go Programing Language)

当x为nil

最后再简单的说一下x为nil的情况,当x为nil时,那么不论断言类型是任何类型,都会断言失败

到此这篇关于Golang断言判断值类型的实现方法的文章就介绍到这了,更多相关Golang断言判断值类型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Golang断言判断值类型的实现方法

本文链接: https://www.lsjlt.com/news/122409.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Golang断言判断值类型的实现方法
    Golang可以通过断言,判断值的类型 s:="hello world" i:=interface{}(s)//将数值转化为interface空接口类型 //需要注意的是,必须是...
    99+
    2022-11-11
  • Golang函数的方法类型断言使用方法
    Golang是一种高效的编程语言,因其简洁、高效和可靠,目前广受欢迎。Golang中的函数和方法类型断言是高级程序员常用的重要工具之一。通过本文,我们将深入探讨Golang函数的方法类型断言的使用方法。方法类型断言简介在Golang中,方法...
    99+
    2023-05-16
    函数 Golang 方法类型断言
  • Golang空接口与类型断言的实现
    目录空接口定义使用场景空接口几个要注意的坑类型断言Go语言中类型断言的两种语法类型断言配合 switch 使用空接口 定义 空接口是特殊形式的接口类型,普通的接口都有方法,而空接口没...
    99+
    2022-11-13
  • 第十八天- 类型判断 函数和方法判断 反
      # isinstance type issubclass 内置函数:# 1.issubclass() 这个内置函数可判断xxx类是否是yyy类型的子类# issubclass(子类,父类) 1 class Base: 2...
    99+
    2023-01-30
    函数 类型 方法
  • javascript中判断数据类型的方法
    这篇文章主要介绍了javascript中判断数据类型的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。js判断数据类型的方法:1、利用typeof操作符,语法“typeof...
    99+
    2023-06-15
  • java判断是否int类型的方法
    java判断是否是int型的方法示例:try { Integer iCheckValue = Integer.parseInt(sContentValue); if (iCheckValue instanceof Intege...
    99+
    2019-09-23
    java
  • golang断言的实现方法是什么
    在Go语言中,断言可以通过类型断言(Type Assertion)来实现。 类型断言的语法形式为x.(T),其中x是一个接口类型的表...
    99+
    2023-10-20
    golang
  • Golang类型断言的具体使用
    目录一,如何检测和转换接口变量的类型二,类型判断:type-switch一,如何检测和转换接口变量的类型 在Go语言的interface中可以是任何类型,所以Go给出了类型断言来判断...
    99+
    2023-03-08
    Golang 类型断言
  • golang中有哪些类型的断言
    golang中有哪些类型的断言?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。package mainimport ("github...
    99+
    2023-06-15
  • shell命令返回值判断的方法实现
    目录1.判断命令是否存在优雅方法1优雅方法2优雅方法32.返回错误退出1.||exit退出2.使用-e3.set-e3.返回错误提示一般方法:优雅方法1.判断命令是否存在 优雅方法1 首先,检查命令是否有效的惯用方法直接...
    99+
    2022-06-05
    shell命令返回值判断 shell命令返回值
  • 分享JavaScript 类型判断的几种方法
    目录一、JavaScript 基本类型1、原始数据类型2、引用数据类型3、两种数据类型的存储方式二、Javascript 数据类型判断的几种方法1、typeof2、instanceo...
    99+
    2022-11-13
  • GO语言查询类型断言的方法
    这篇文章主要介绍“GO语言查询类型断言的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“GO语言查询类型断言的方法”文章能帮助大家解决问题。类型查询我们知道interface的变量里面可以存储任意...
    99+
    2023-06-30
  • JS中数据类型的正确判断方法实例
    目录前言 typeof是否能正确判断类型? instanceof是否能正确判断类型? Object.prototype.toString.call() constructor Arr...
    99+
    2022-11-12
  • java判断文件类型的方法是什么
    Java可以通过以下方法来判断文件的类型:1. 使用java.nio.file.Files类的probeContentType()方...
    99+
    2023-10-09
    java
  • Python字符类型判断的方法是什么
    Python中判断字符类型的方法有以下几种:1. 使用type()函数判断字符的类型。例如,type('a')的返回结果是,表示字符...
    99+
    2023-08-19
    Python
  • JS中的四种数据类型判断方法
    目录1、typeof2、instanceof3、constructor4、toString() 本文总结了四种判断方法: 1、typeof typeof是一个运算符,其有两种使用方式...
    99+
    2022-11-12
  • javascript判断是否为数字类型的方法
    小编给大家分享一下javascript判断是否为数字类型的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!方法:1、利用typeof关键字和isNaN()函数判断;2、利用typeof关键字和isFinite()函数判断...
    99+
    2023-06-14
  • Numpy对于NaN值的判断方法
    numpy.nan的数据类型是float类型 import numpy as np type(np.nan) # float 任何数字和numpy.nan进行计算,返回的结果都是na...
    99+
    2023-02-10
    Numpy NaN值 Numpy 于NaN值判断
  • 使用JavaScript怎么实现类型判断
    今天就跟大家聊聊有关使用JavaScript怎么实现类型判断,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、判断引用类型和基本类型的类型是不同的,判断基本类型可以用typeof:t...
    99+
    2023-06-15
  • javascript中类型判断的最佳方式
    javascript有8种数据类型 值类型 NumberNullUndefinedStringSymbolBooleanBigInt 引用类型 ObjectArrayFunction...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作