golang界面如何判断为空无的实现代码

  介绍

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

golang的优点

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

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

界面底层结构

根据接口是否包含有方法,底层实现上用两种结构来表示:iface和eface.eface表示不含接口方法的结构,或者叫空接口。

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

1。eface

type  eface  struct  {   ,,,_type  * _type   ,,,data  unsafe.Pointer   }   type  _type  struct  {   ,,,size ,,,,,, uintptr //type 大小   ,,,ptrdata ,,, uintptr //, size  of  memory  prefix  holding  all 指针   ,,,hash ,,,,,, uint32 ,//, hash  of 类型;,avoids  computation  hash 拷贝表   ,,,tflag ,,,,, tflag ,,//, extra  type 方式、旗帜   ,,,align ,,,,, uint8 ,,//, alignment  of  variable  with 却;能够类型   ,,,fieldalign  uint8 ,,//, alignment  of  struct  field  with 却;能够类型   ,,,kind ,,,,,, uint8 ,,//enumeration  for  C   ,,,alg ,,,,,,, * typeAlg ,//algorithm 表   ,,,gcdata ,,, * byte ,,,//garbage  collection 数据   ,,,str ,,,,,, nameOff ,//string 形式   ,,,ptrToThis  typeOff ,//, type  for  pointer 用却;能够类型,may  be 零   }

2。iface

iface表示非空接口的底层实现。相比于空界面,非空要包含一些method.method的具体实现存放在itab。乐趣变量里。如果接口包含多个方法,这里只有一个乐趣变量怎么存呢?这个下面再细说。

type  iface  struct  {   ,,,tab  * itab   ,,,data  unsafe.Pointer   }//,layout  of  Itab  known 用编译器//,allocated  non-garbage-collected 内存拷贝//,Needs 用be  sync 拷贝//,. ./cmd/编译/内部/gc/reflect.go:/^ func.dumptypestructs。   type  itab  struct  {   ,,,inter  * interfacetype   ,,,_type  * _type   ,,,link , * itab   ,,,bad ,, int32   ,,,inhash  int32 ,,,,,//, has 却;能够itab  been  added 用散列?   ,,,fun ,,, [1] uintptr //variable 大小   }

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

struct  Iface   {   ,,,Itab *,标签;   ,,,void *,数据;   };   struct  Itab   {   ,,,InterfaceType *,国际米兰;   ,,,*类型,类型;   ,,,void (*乐趣[])(空白);   };

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

再来看下零的定义。

nil的定义

//零是一个预先声明的标识符代表一个指针的零值,通道,函数,接口,地图,或者片类型。

var nil类型//类型必须是一个指针,通道,函数,接口,地图,或片类型

也就是说,只有指针,通道,函数,接口,地图,或者片这些类型的值才可以是零。

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

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

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

例如,

var  w  io.Writer

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

例如,下面的例子。

package 主要   import  (“fmt")   func  main () {   ,,,,,,var  a 界面{},=,nil //, tab =, nil,, data =nil   ,,,,,,var  b 界面{},=,(* int)(零),//,tab 包含,* int 类型信息,,data =nil   ,,,,,,fmt.Println (==nil)   ,,,,,,fmt.Println (b==nil)   null   null   null   null   null   null   null   null   null   null   null   null   null

golang界面如何判断为空无的实现代码