iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang interface如何判断为空nil的实现代码
  • 797
分享到

golang interface如何判断为空nil的实现代码

2023-06-14 19:06:04 797人浏览 泡泡鱼
摘要

这篇文章主要介绍了golang interface如何判断为空nil的实现代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Golang的优点golang是一种编译语言,可以

这篇文章主要介绍了golang interface如何判断为空nil的实现代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

Golang的优点

golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器而无需额外的依赖,所以golang的性能优于其他的解释性语言,且可以在golang中使用goroutine来实现并发性,它提供了一个非常优雅的goroutine调度程序系统,可以很容易地生成数百万个goroutine。

要判断interface 空的问题,首先看下其底层实现。

interface 底层结构

根据 interface 是否包含有 method,底层实现上用两种 struct 来表示:iface 和 eface。eface表示不含 method 的 interface 结构,或者叫 empty interface。

对于 Golang 中的大部分数据类型都可以抽象出来 _type 结构,同时针对不同的类型还会有一些其他信息。

1.eface

type eface struct {    _type *_type    data  unsafe.Pointer}type _type struct {    size       uintptr // type size    ptrdata    uintptr // size of memory prefix holding all pointers    hash       uint32  // hash of type; avoids computation in hash tables    tflag      tflag   // extra type infORMation flags    align      uint8   // alignment of variable with this type    fieldalign uint8   // alignment of struct field with this type    kind       uint8   // enumeration for C    alg        *typeAlg  // algorithm table    GCdata    *byte    // garbage collection data    str       nameOff  // string form    ptrToThis typeOff  // type for pointer to this type, may be zero}

2.iface

iface 表示 non-empty interface 的底层实现。相比于 empty interface,non-empty 要包含一些 method。method 的具体实现存放在 itab.fun 变量里。如果 interface 包含多个 method,这里只有一个 fun 变量怎么存呢?这个下面再细说。

type iface struct {    tab  *itab    data unsafe.Pointer}// layout of Itab known to compilers// allocated in non-garbage-collected memory// Needs to be in sync with// ../cmd/compile/internal/gc/reflect.go:/^func.dumptypestructs.type itab struct {    inter  *interfacetype    _type  *_type    link   *itab    bad    int32    inhash int32      // has this itab been added to hash?    fun    [1]uintptr // variable sized}

概括起来,接口对象由接口表 (interface table) 指针和数据指针组成,或者说由动态类型和动态值组成。

struct Iface{    Itab* tab;    void* data;};struct Itab{    InterfaceType* inter;    Type* type;    void (*fun[])(void);};

接口表存储元数据信息,包括接口类型、动态类型,以及实现接口的方法指针。无论是反射还是通过接口调用方法,都会用到这些信息。

再来看下nil的定义。

nil的定义

// nil is a predeclared identifier representing the zero value for a pointer, channel, func, interface, map, or slice type.

var nil Type // Type must be a pointer, channel, func, interface, map, or slice type

也就是说,只有pointer, channel, func, interface, map, or slice 这些类型的值才可以是nil.

如何判定interface里面的动态值是否空

对于一个接口的零值就是它的类型和值的部分都是nil。

一个接口值基于它的动态类型被描述为空或非空。

例如,

var w io.Writer

一般情况下,通过使用w==nil或者w!=nil来判读接口值是否为空,只是判断了动态类型,而没有判断动态值。

例如,下面的例子。

package mainimport ("fmt")func main(){       var a interface{} = nil // tab = nil, data = nil       var b interface{} = (*int)(nil) // tab 包含 *int 类型信息, data = nil       fmt.Println(a==nil)       fmt.Println(b==nil)}

output:

true

false

上面代码中,接口b的动态类型为*int, 而动态值为nil,直接使用等于号无法判断。

所以不能直接通过与nil比较的方式判断动态值是否为空。

那如何判断动态值是否为空?

可以借助反射来判断。

func IsNil(i interface{}) bool {    defer func() {        recover()    }()    vi := reflect.ValueOf(i)    return vi.IsNil()}

其中,IsNil定义如下:

func (v Value) IsNil() bool

参数v必须是chan, func, interface, map, pointer, or slice,否则会panic。

如果调用IsNil的不是一个指针,会出现异常,需要捕获异常。

或者修改成这样:

func IsNil(i interface{}) bool {    vi := reflect.ValueOf(i)    if vi.Kind() == reflect.Ptr {        return vi.IsNil()    }    return false}

总结

一个接口包括动态类型和动态值。

如果一个接口的动态类型和动态值都为空,则这个接口为空的。

补充:golang返回值为interface{}的类型判断

看标题就知道,这是一个很简单的问题,就一个函数的事,但是,今天一同学golang的几个人中,已经不止一个人问我了,在这里我就说一下,也希望对不清楚的娃有些许帮助,大神别喷,飘过就行了。

大家知道,golang对于不确定返回值可以用interface{}代替,这确实很方便,但是也带来了问题,那就是如何判断返回值是什么类型的?其实可以用反射也就是reflect来判断,通过函数

reflect.TypeOf()

即返回类型!

感谢你能够认真阅读完这篇文章,希望小编分享的“golang interface如何判断为空nil的实现代码”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网GO频道,更多相关知识等着你来学习!

您可能感兴趣的文档:

--结束END--

本文标题: golang interface如何判断为空nil的实现代码

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

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

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

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

下载Word文档
猜你喜欢
  • golang interface判断为空nil的实现代码
    要判断interface 空的问题,首先看下其底层实现。 interface 底层结构 根据 interface 是否包含有 method,底层实现上用两种 struct 来表示:i...
    99+
    2024-04-02
  • golang interface如何判断为空nil的实现代码
    这篇文章主要介绍了golang interface如何判断为空nil的实现代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。golang的优点golang是一种编译语言,可以...
    99+
    2023-06-14
  • Golang-如何判断一个 interface{} 的值是否为 nil
    目录引用例子两个 interface 比较interface 与 非 interface 比较参考资料引用 起初我会下意识的回答,直接 v == nil 进行判断不就好了吗?然后翻阅...
    99+
    2023-05-20
    Golang判断 interface{} 是否为 nil Golang判断 interface
  • mysqlwhere中如何判断不为空的实现
    mysql是开源免费的关系型数据库,由于其是免费的,所以使用也是比较广泛的。 mysql数据库的空分为两种:Null、空字符串 本文将针对这些空演示如何判断是否为空,以及如何写sql...
    99+
    2024-04-02
  • php判断数组元素不为空格实例代码
    1、使用foreach ($arr as $value){}语句遍历数组。 2、使用if($value!=" ")语句判断数组元素是否为空格。 3、如果数组元素全部不为空,则输出数组...
    99+
    2024-04-02
  • golang如何用type-switch判断interface变量的实际存储类型
    目录用type-switch判断interface的实际存储类型type-switch就刚好帮我解决了这个问题golang任何类型interface{}example1example...
    99+
    2024-04-02
  • 如何实现判断分区格式的bat代码
    这篇文章主要介绍如何实现判断分区格式的bat代码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!代码如下:@echo off :1 cls set/p pan=请输入要...
    99+
    2023-06-08
  • java如何判断实体类是否为空
    在Java中,判断一个实体类是否为空可以根据实体类中的属性是否为null来进行判断。以下是几种常见的判断方式:1. 判断对象是否为n...
    99+
    2023-09-25
    java
  • python实现有效的括号判断实例代码
    目录题目描述测试用例代码实现总结题目描述 给定一个只包括 '(',')','{','}','[',&#...
    99+
    2024-04-02
  • 数据库中如何实现网格部件判断字段不能为空
    这篇文章给大家分享的是有关数据库中如何实现网格部件判断字段不能为空的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在最近的开发中,发现上一次发的网格部件判断字段不能为空的代码,还存...
    99+
    2024-04-02
  • StringUtils,CollectionUtils判断为空的方法和原生代码哪个效率最高
    目录StringUtils,CollectionUtils判断为空的方法和原生代码哪个效率高结论 isBlank与isEmpty区别CollectionUtils封装类,判...
    99+
    2024-04-02
  • JavaScript中如何判断对象是否为空的方法
    目录Object.keys()示例为什么需要额外判断对象的构造函数呢?另一种边界情况总结在自己的日常开发中,一般使用Object.keys()来判断对象是否为空: const obj...
    99+
    2024-04-02
  • PHP实现判断数字位数的实用代码示例
    PHP实现判断数字位数的实用代码示例 在开发过程中,有时我们需要判断一个数字的位数,比如判断一个数字是几位数,或者判断一个数字是否是一个特定位数。下面给出几个实用的 PHP 代码示例来...
    99+
    2024-04-02
  • JS实现判断对象是否为空对象的5种方法
    1.将json对象转化为json字符串,再判断该字符串是否为"{}" var data = {}; var b = (JSON.stringify(data) == "{}")...
    99+
    2024-04-02
  • 非Vuex实现的登录状态判断封装实例代码
    目录前言登录状态封装getTokenisLogin使用方法setToken最后前言 在项目中肯定会有用户登录状态的判断,所以我们需要封装判断登录状态,用来满足整个项目的应用,当然刚不...
    99+
    2024-04-02
  • js如何实现多个条件的判断
    小编给大家分享一下js如何实现多个条件的判断,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!多个条件的判断当我们需要进行多个值的判断时,我们可以使用数组的inclu...
    99+
    2023-06-26
  • 如何编写Ajax无刷新在注册用户名时判断是否为空是否被使用代码
    本篇内容介绍了“如何编写Ajax无刷新在注册用户名时判断是否为空是否被使用代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅...
    99+
    2024-04-02
  • Shell实现根据日期、月份、星期判断年份的代码
    本篇内容主要讲解“Shell实现根据日期、月份、星期判断年份的代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Shell实现根据日期、月份、星期判断年份的代码”吧!已知三个时间变量:time1...
    99+
    2023-06-09
  • 如何实现Python调用Golang代码详解
    1.调用编译后的动态库文件,报头文件错误 原因: 不同平台下编译的add.so 不能通用,Windows下可以运行的so文件,linux下就不能运行,需要重新编译linux的so文件...
    99+
    2023-05-20
    Python调用golang方法 Python调用golang代码
  • PHP如何实现判断两次密码输入是否一致
    这篇文章主要介绍了PHP如何实现判断两次密码输入是否一致的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PHP如何实现判断两次密码输入是否一致文章都会有所收获,下面我们一起来看看吧。(一)表单设计首先,我们需要在...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作