0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是空接口?空接口代码示例

马哥Linux运维 来源:cnblogs 2024-04-30 12:59 次阅读

接口

空接口是指没有定义任何接口方法的接口。没有定义任何接口方法,意味着Go中的任意对象都可以实现空接口(因为没方法需要实现),任意对象都可以保存到空接口实例变量中。

空接口的定义方式:

1

2

type empty_int interface {

}

通常会简写为type empty_int interface{}。

更常见的,会直接使用interface{}作为一种类型,表示空接口。例如:

1

2

// 声明一个空接口实例

var i interface{}

再比如函数使用空接口类型参数

func myfunc(i interface{})

在Go中很多地方都使用空接口类型的参数,用的最多的fmt中的Print类方法:

1

2

$ go doc fmt Println

func Println(a 。..interface{}) (n int, err error)

空接口数据结构

可以定义一个空接口类型的array、slice、map、struct等,这样它们就可以用来存放任意类型的对象,因为任意类型都实现了空接口。

例如,创建一个空接口的slice:

1

2

3

4

5

6

7

8

9

10

11

12

13

package main

import “fmt”

func main() {

any := make([]interface{}, 5)

any[0] = 11

any[1] = “hello world”

any[2] = []int{11, 22, 33, 44}

for _, value := range any {

fmt.Println(value)

}

}

输出结果:

1

2

3

4

5

11

hello world

[11 22 33 44]

《nil》

《nil》

显然,通过空接口类型,Go也能像其它动态语言一样,在数据结构中存储任意类型的数据。

再比如,某个struct中,如果有一个字段想存储任意类型的数据,就可以将这个字段的类型设置为空接口:

1

2

3

4

type my_struct struct {

anything interface{}

anythings []interface{}

}

拷贝数据结构到空接口数据结构

前面解释了任意类型的对象都能赋值给空接口实例。

1

2

3

var any interface{}

any = “hello world”

any = 11

空接口是一种接口,它是一种指针类型的数据类型,虽然不严谨,但它确实保存了两个指针,一个是对象的类型(或iTable),一个是对象的值。所以上面的赋值过程是让空接口any保存各个数据对象的类型和对象的值。

换一种角度考虑,空接口有自己的内存布局方式:两个指针,占用两个机器字长。

Golang给的一个经典的示例:将某个slice中的数据拷贝到空接口slice中将报错。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

package main

import “fmt”

func main() {

testSlice := []int{11,22,33,44}

// 成功拷贝

var newSlice []int

newSlice = testSlice

fmt.Println(newSlice)

// 拷贝失败

var any []interface{}

any = testSlice

fmt.Println(any)

}

这是因为每个空接口的内存布局都占用两个机器字长的内容。对于长度为N的空接口slice来说,它的每个元素都是以2机器字长为单元的连续空间,共占用N*2个机器字长的空间。

而普通的slice,例如上面的testSlice,它的每个元素是int类型的,int类型的内存布局和空接口不一样。

这些对象的内存布局在编译期间就已经确定好了,所以没法直接将不同内存布局的数据结构进行拷贝。

要想完成期待的拷贝,可以使用for-range的方式,将testSlice中的每个元素赋值给空接口slice的空接口元素:也就是一个个的空接口实例。

1

2

3

4

var any []interface{}

for _,value := range testSlice{

any = append(any,value)

}

这样,空接口Slice中的每个空接口实例都指向更底层的各个数据对象。而不是像前面错误的拷贝方式:每个空接口元素想要当作这些数据对象。

不仅空接口的Slice如此,其它包含空接口的数据结构,也都类似。

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8580

    浏览量

    151047
  • 数据类型
    +关注

    关注

    0

    文章

    236

    浏览量

    13618

原文标题:空接口

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    消息邮箱发送消息和非消息产生一样的效果

    原子哥,我测试消息邮箱时先定义消息为 SeMbox = OSMboxCreate((void *)0);再按键中断发送消息为什么发送 OSMboxPostOpt(SeMbox,(void *)0
    发表于 05-08 06:36

    时码.ppt

    分层时码;基于发射分集的时码;单输入单输出(SISO)到多输入多输出(MIMO);时码频谱效率高,抗平坦衰落;还不适合严重非平坦衰落信道。
    发表于 06-14 23:07 16次下载

    助听器锌电池

    助听器锌电池 助听器锌电池图
    发表于 12-16 08:51 789次阅读

    电池问答

    电池问答 问:锌电池的内部结构是怎样的,它是怎么工作的 电池构造: 成
    发表于 12-16 09:07 879次阅读

    分光交换(SDPS),分光交换(SDPS)是什么意思

    分光交换(SDPS),分光交换(SDPS)是什么意思 分光交换威廉希尔官方网站 就是在空间域上对光信号进行交换,其基本原理是将光交换元件组成门阵列开关,并适
    发表于 03-20 10:18 3023次阅读

    分多址(SDMA),分多址(SDMA)是什么意思

    分多址(SDMA),分多址(SDMA)是什么意思 分多址(SDMA):这种威廉希尔官方网站 是利用空间分割构成不同的信道。举例来说,在一颗卫星上使用
    发表于 04-03 13:40 3523次阅读

    STM32F091片使用System Bootloader下载

    STM32F091片使用System Bootloader下载代码
    发表于 12-07 18:17 0次下载

    STM32F091片编程后怎样直接运行用户代码

    STM32F091片编程后不能直接运行用户代码的分析与解决。
    的头像 发表于 08-31 14:16 7205次阅读
    STM32F091<b class='flag-5'>空</b>片编程后怎样直接运行用户<b class='flag-5'>代码</b>

    基于预器跳闸后的处理

    预器是锅炉的重要辅机,机组运行中一台预器跳闸若未及时处理或处理不当,可能会造成锅炉MFT或空气预热器变形卡涩等,对机组安全运行形成巨大威胁。预器入口烟气温度高极易引起预器膨胀不
    发表于 02-05 14:28 0次下载

    API-Shop-OCR-营业执照识别API接口Python调用示例代码说明

    本文档的主要内容详细介绍的是API-Shop-OCR-营业执照识别API接口Python调用示例代码说明
    发表于 01-10 11:48 6次下载
    API-Shop-OCR-营业执照识别API<b class='flag-5'>接口</b>Python调用<b class='flag-5'>示例</b><b class='flag-5'>代码</b>说明

    预器是什么,有哪些作用

    预器是电厂锅炉中的重要设备。不同的发电机组,预器的规格类别也是有所差异的。本篇内容泓江智造就一起和大家聊聊关于预器相关的问题。
    发表于 07-16 15:24 2w次阅读

    图形引擎服务场景化接口示例代码

    简介 图形引擎服务场景化接口示例代码演示了如何调用SceneView、ARView和FaceView进行图形渲染。 开发准备 1.检查Android Studio开发环境是否就绪。使用Android
    发表于 03-23 10:57 1次下载

    MPC82系列MCU的SPI(串行外围接口)示例代码

    MPC82系列MCU的SPI(串行外围接口)示例代码
    发表于 06-30 17:35 0次下载
    MPC82系列MCU的SPI(串行外围<b class='flag-5'>接口</b>)<b class='flag-5'>示例</b><b class='flag-5'>代码</b>

    python如何定义二维数组

    和列的数量,并将它们初始化为0。然后,可以使用一个for循环来逐行创建一个的一维列表,并使用另一个for循环来向的二维列表中添加这些一维列表。 下面是一个示例代码,创建一个3行4列
    的头像 发表于 11-21 15:12 1768次阅读

    什么是芯光纤?为什么需要芯光纤?

    芯光纤(Hollow-core fiber)—— 一种新型传输媒介 。
    的头像 发表于 12-27 09:22 953次阅读