首页 > 其他分享 >Go语言中的iface和eface

Go语言中的iface和eface

时间:2023-07-25 14:22:05浏览次数:33  
标签:iface 指向 eface 接口 Go 指针

ifaceeface 是 Go 语言中用于实现接口的两种内部数据结构。它们都用于在运行时表示接口值,但它们在处理不同类型的接口上有不同的用途和区别。

  1. iface(interface value)

    • iface 是用于表示具有非空接口值的数据结构。
    • iface 结构包含两个字段:一个指向实际值的指针和一个指向类型的指针。
    • iface 用于处理实现了非空接口的具体值。
  2. eface(empty interface value)

    • eface 是用于表示空接口值的数据结构。
    • eface 结构也包含两个字段:一个指向实际值的指针和一个指向类型的指针。
    • eface 用于处理空接口值,即interface{}类型。

下面是两种数据结构的简化表示形式:

type iface struct {
	tab  *itab // 指向类型信息的指针
	data unsafe.Pointer // 指向实际值的指针
}

type eface struct {
	_type *_type // 指向类型信息的指针
	data  unsafe.Pointer // 指向实际值的指针
}

需要注意的是,ifaceeface 是 Go 语言编译器和运行时系统的内部数据结构,它们对于大多数应用程序开发者来说是透明的,一般不需要直接操作这些结构。使用接口时,Go 语言的类型系统和运行时系统会自动处理接口值的转换和比较。

接口类型的变量是一种特殊的类型,它能够持有任何类型的值。空接口interface{}更为特殊,它可以持有任何类型的值。这种灵活性是 Go 语言中接口的一大优势,它允许我们在编写通用代码时不必关心具体的数据类型。

总结来说,ifaceeface 是 Go 语言内部用于表示接口值的数据结构,iface 用于处理非空接口值,eface 用于处理空接口值。对于大多数 Go 语言开发者而言,这些细节是不需要关心的,我们只需使用接口的声明和实现来实现多态性和通用性。

标签:iface,指向,eface,接口,Go,指针
From: https://www.cnblogs.com/tangjicheng/p/17579779.html

相关文章

  • calico报错son: cannot unmarshal string into Go struct field NetConf.mtu of type
     于是describe查看宿主机的配置文件查看日志没有相关日志查看calico的相关配置文件值找到于是想着直接去修改calico的Configmap发现修改不成功便去查询宿主机映射的calico挂载文件把标记部分的string给成int去掉双引号,然后重启calico然后通过ansible分发到每台机器上an......
  • Cloud Ace 成为 Google Cloud Next '23 联合赞助商
    CloudAce是谷歌云全球战略合作伙伴,拥有300多名工程师,也是谷歌最高级别合作伙伴,多次获得GoogleCloud合作伙伴奖。作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训服务。CloudAce,Inc.(总部位于东京千代田区;总裁青木诚;以下简称“CloudAce”)将成......
  • 【go语言】1.1.1 Go 语言的历史和背景
    Go语言,也被称为Golang,是一种静态强类型、编译型的开源编程语言。Go语言的出现是为了解决当下的软件开发问题,特别是大规模软件系统的开发。Go语言的设计者包括RobertGriesemer、RobPike和KenThompson,他们都是在Google工作的资深工程师。他们发现当时的编程语言,无论是......
  • Go defer 去掉闭包函数,靠谱吗?
    在Go中使用defer时,如果defer语句包含了一个闭包函数,需要特别小心。因为defer语句会在函数返回时执行,而闭包函数可能会捕获外部变量,导致意想不到的结果。在Go中,defer语句中的闭包函数捕获的是变量的地址,而不是变量的值。如果闭包函数在defer执行时才被调用,可能会导致捕获的变量值......
  • go语言gorm
    ORM对象关系映射(ObjectRelationalMapping,ORM)。指的是对象和关系之间的映射,使用面向对象的方式操作数据库。关系模型和Go对象之间的映射table=>struct,表映射为结构体row=>object,行映射为实例column=>property,字段映射为属性可以认为ORM是一种高级抽象,对......
  • go install 和 go get的区别
    goinstall和goget都是Go语言中的命令行工具,用于处理依赖关系和安装包。它们的主要区别在于功能和使用场景。goinstall:功能:goinstall命令用于编译并安装指定的包或可执行程序到Go语言的工作空间(GOPATH)的bin目录下。如果没有指定包名,则会安装当前目录下的包或可......
  • 饮冰三年-人工智能-Django淘宝拾遗-85-常用的Python格式化工具
       Python代码格式化对于团队协作、代码质量、错误预防以及与Python社区的契合都具有重要意义。好的代码格式化不仅是一种编码规范,更是一种良好的编码习惯,有助于提高整个项目的质量和可维护性。   在团队中,可能有不同的编码规范和自定义的格式化规则。尽管有一些格式......
  • MongoDB 教程二: 添加, 删除,查询 shell命令
       MongoDBShell常用操作命令MonoDB shell命令操作语法和JavaScript很类似,其实控制台底层的查询语句都是用JavaScript脚本完成操作的。 Ø数据库//1、Help查看命令提示helpdb.help();db.yourColl.help();db.youColl.find().help();rs.help();//2、切换/创建......
  • ssh unable to negotiate
    打开~/.ssh/config文件,在文件最开始添加以下配置并保存:Host*HostkeyAlgorithms+ssh-rsaPubkeyAcceptedAlgorithms+ssh-rsa  MacOSVentura系统ssh不再支持ssh-rsa的原因及解决办法https://blog.twofei.com/881/#solution......
  • PyCharm 在PyCharm中运行Django测试的日志输出
    环境:Windows10  +PyCharm2022.3.3+ Djangoversion4.2.3via: https://docs.djangoproject.com/zh-hans/4.2/topics/logging/#configuring-logging 日志模块配置:在settings.py添加如下配置: importosLOGGING={"version":1,"disable_existi......