这篇文章主要介绍了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 nullgolang界面如何判断为空无的实现代码