Redian新闻
>
带你拿捏Go空接口

带你拿捏Go空接口

公众号新闻

空接口

空接口是指没有定义任何接口方法的接口。没有定义任何接口方法,意味着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如此,其它包含空接口的数据结构,也都类似。

链接:https://www.cnblogs.com/f-ck-need-u/p/9941402.html

(版权归原作者所有,侵删)


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
快查查!平均3145美元!已发放超过4300万份!这笔钱你拿到了吗?拿捏人性,高手都深谙这个道理今天是闰日【猜测】AmEx Gold 可能年费要涨到$325、出现White Gold卡面?今年的performance review,你拿到满意的rating了吗?一线经理为你揭秘业绩考核机制「 云集 | 职挂云帆 」Golden Goose 确认最早将于6月在米兰 IPO这个爬藤必备竞赛,我们准备好助你拿奖了!go高并发之路—go语言如何解决并发问题线下面试机会等你拿!龙湖集团2024届仕官生校园招聘已开启Google 手机设计细节曝光,苹果三星都没它显眼|Google 工业设计总监专访可口可乐亲手「毁」掉了自家的经典 Logo | Feel Good 周报Go Canucks Go! 大温球迷疯涌上街庆祝 两省长打起了擂台Go 的函数,方法和接口UCL143个专业可补申!王爱曼华700+缺口,Extra & Clearing如何助你拿下理想offer?2024奥巴马医保礼卡已放出!百元礼卡等你拿,快看如何领取!没买医保?现在还可投保!黄仁勋每天都用的 AI 产品,来自 Google,颠覆 Google围墙边种什么树好?拿捏阮经天的女人,才不是谁的前妻英国超市ocado限时75折!AMI/Golden Goose精选6折!西太后75折!回国伴手礼大盘点, 帮你拿捏吃货亲友!GO接口三个特性漂流四海的凌霄花(2)扔掉小红书,国外自由行:Pokémon Go 和 Google Gemini 帮助打造最强旅游 CopilotJellycat限时巨折!2折起:英国优衣库/Diesel/GoldenGoose/We11done等!不是斋月是摘月!欧文空接炸筐!正负值+37冠绝全场!GO GO GO !双林奇案录第三部之校园疑案:第十四节Golden Goose黄金鹅一季度净销售额同比增长11%GOLANG接口三个特性普京才是贵客,越南要求欧盟特使推迟访问:领导人没空接待【解字】闰日说“正闰”官方紧急提醒!超5万人申请,审理出现大塞车!移民终极目标!?手把手教你拿到新西兰护照!go高并发之路——go语言如何解决并发问题注意!30KG海运直接免费,还有压轴豪礼等你拿!优惠叠加,运费一省到底!Costco这款热销产品召回!手把手教你拿回$600刀!
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。