首页 > 其他分享 >接口interface

接口interface

时间:2023-10-15 17:34:15浏览次数:27  
标签:iface eface type 接口 interface data

1. 接口的底层结构体

iface和eface,区别在于iface描述的接口包含方法,而eface则是不包含任何方法的空接口:interface{}

1.1 iface源码

type iface struct {
	tab  *itab
	data unsafe.Pointer
}

type itab struct {
	inter  *interfacetype
	_type  *_type
	link   *itab
	hash   uint32 // copy of _type.hash. Used for type switches.
	bad    bool   // type does not implement interface
	inhash bool   // has this itab been added to hash?
	unused [2]byte
	fun    [1]uintptr // variable sized
}

说明:iface内部维护两个指针,tab指向一个itab实体, 表示接口的类型以及赋给这个接口的实体类型。data指向接口具体的值,一般而言是一个指向堆内存的指针

interfacetype类型:

type interfacetype struct {
    typ     _type
    pkgpath name
    mhdr    []imethod
}

iface结构体图示:

1.2 eface的源码

type eface struct {
    _type *_type // 动态类型
    data  unsafe.Pointer
}

说明:eface维护了一个 _type 字段,表示空接口所承载的具体的实体类型,data描述了具体的值

举例:

f, _ := os.Open("text.txt") // f => *os.File
var i1 interface{}
i1 = f

说明:eface的data字段的值就是f,_type就是*os.File类型的元数据

验证:

func TestInterface(t *testing.T) {
	f, _ := os.Open("text.txt")
	fmt.Printf("f pointer:%p\n", f)
	fmt.Println("==========")

	var i1 interface{}
	i1 = f
	ptr2 := unsafe.Pointer(&i1)
	opt2 := (*[2]unsafe.Pointer)(ptr2)
	fmt.Println("interface: ", opt2[0], opt2[1])
}

输出:

f pointer:0xc00000e038
==========
interface:  0x11091e0 0xc00000e038

说明: i1的interface{}变量的data值与f的地址是一样的。

标签:iface,eface,type,接口,interface,data
From: https://www.cnblogs.com/xiaojuzi1024/p/17765863.html

相关文章

  • JTAG各类接口针脚定义及含义
    TAG各类接口针脚定义及含义 JTAG有10pin的、14pin的和20pin的,尽管引脚数和引脚的排列顺序不同,但是其中有一些引脚是一样的,各个引脚的定义如下。 一、引脚定义TestClockInput(TCK)-----强制要求1TCK在IEEE1149.1标准里是强制要求的。TCK为TAP的操作提供了一个独立的......
  • How to use Linux shell script to create a command line interactive menu window i
    HowtouseLinuxshellscripttocreateacommandlineinteractivemenuwindowinterfaceAllInOne如何使用Linuxshellscript制作一个命令行交互式菜单窗口界面AllInOneQ:如何实现一个类似raspi-config的交互式命令行菜单功能raspi-configistheRaspberr......
  • 无涯教程-Matplotlib - 面向对象接口
    尽管使用matplotlib.pyplot模块可以轻松快速地生成图,但是建议使用面向对象的方法,因为它可以更好地控制和自定义图。在面向对象的界面中,Pyplot仅用于一些功能,例如图形创建,并且用户显式创建并跟踪图形和轴对象,在此级别上,用户使用Pyplot创建图形,并通过这些图形可以创建一个或多个......
  • [转]go语言函数装饰器,接口类型变量反射赋值
     转:原文:https://juejin.cn/post/7115343063119036453------------------------ 函数装饰做基础组件经常需要用到函数修饰,例如我需要对所有被装饰方法里打印start、end。已知函数签名的装饰我们经常用的函数装饰器一般都是知道被装饰的方法的签名,然后返回一个同签名的方......
  • 使用api调用chatGPT,python自定义接口方法
    用非官网的api一般要把官网地址https://api.openai.com/改为相应网站的url。今天测试的时候找了各种教程都没什么用,最后终于成功了,代码如下:importopenaiimportjsonimportosopenai.api_key="sk-xxxxxxxxxx"#改成你的keyopenai.api_base="https://yyyyyyyyyy/v1"#改成......
  • 最近在对接电商供应链,说说开放平台API接口
    B2B电商开放平台的设计需要从以下几面去思考:开放平台API接口的设计,主要是从功能需求的角度,设计满足业务需求的接口及对应的字段;平台与商家之间信息的对接,对接的方法有哪些?对接过程中需要可能会遇到什么问题;同步开关及权限的设计,处理信息自动同步和手动设置之间的矛盾。一、开放平台......
  • API接口:查询企业联系人邮箱及相关信息
    查询企业联系人邮箱API接口是一种非常实用的API接口,它可以帮助我们快速获取企业联系人的邮箱地址。这个接口可以在各种需要进行营销活动或者联系客户的场合中使用,例如邮件广告、市场调研等。这篇博文将详细介绍这个API接口的原理和功能,并提供示例代码来演示如何使用这个接口。......
  • 无涯教程-DBUtils - MapListHandler接口
    org.apache.commons.dbutils.MapListHandler是ResultSetHandler接口的实现,负责将ResultSet行转换为Maps列表,此类是线程安全的。MapListHandler-声明以下是org.apache.commons.dbutils.MapListHandler类的声明-publicclassMapListHandlerextendsAbstractListHandler......
  • Postman接口测试
    编写代码之前需手动提前创建并选择对应的环境!!!postman使用的是js语言1、自动关联数据描述:接口A的请求参数依赖于接口B的响应数据例如:接口调用需要登录校验,需要先调登录接口拿到token/cookie解决方法:①从接口B的响应数据中提取关联数据,保存关联数据在公共容器中pm对象的详......
  • Java8新特性之接口的默认方法和静态方法(四)
    1.背景介绍在Java8之前,接口中定义的方法都是抽象方法,即默认都是被publicabstract修饰的;但从Java8开始,允许在接口中定义带有方法体的默认方法和静态方法;publicclassInterfaceTest{publicstaticvoidmain(String[]args){}}interfaceInterfaceA{/*......