go语言接口怎么写(必备3篇)

个人学习 48 0

go语言接口怎么写 第1篇

对于普通方法,无论是值类型还是指针类型的实例,都能正常调用,且调用时拷贝的内容都由receiver的类型决定

指针类型的receiver决定了无论是值类型还是指针类型的实例,都拷贝实例的指针。值类型的receiver决定了无论是值类型还是指针类型的实例,都拷贝实例本身

所以,对于person数据结构:

()()都是拷贝整个person实例,只不过Go对待()时多一个_步骤_:将其解除引用。所以()等价于(*p2).method1()

()()都拷贝person实例的指针,只不过Go对待()时多一个_步骤_:创建一个额外的引用。所以,()等价于(&p1).method2()

而类型实现接口方法时,method set规则决定了类型实例是否实现了接口。

对于接口abc、接口方法method1()、method2()和结构person:

()()以及()都是允许的,都会通过接口实例去调用具体person实例的方法。

()是错误的,因为method2()的receiver是指针类型的,导致p1没有实现接口abc的method2()方法。

go语言接口怎么写 第2篇

前面说了,接口类型是指针类型,但是它到底存放了什么东西?

接口类型的数据结构是2个指针,占用2个机器字长。

当将类型实例c赋值给接口实例ins1后,用println()函数输出ins1和c,比较它们的地址:

输出结果:

从结果中可以看出,接口实例中包含了两个地址,其中第二个地址和类型实例c的地址是完全相同的。而第二个地址c是Circle的指针类型实例,所以ins中的第二个值也是指针。

ins中的第一个是指针是什么?它所指向的是一个内部表结构iTable,这个Table中包含两部分:第一部分是实例c的类型信息,也就是*Circle,第二部分是这个类型(Circle)的方法集,也就是Circle类型的所有方法(此示例中Circle只定义了一个方法Area())。

所以,如图所示:

注意,上图中的实例c是指针,是指针类型的Circle实例。

对于值类型的Square实例s,ins2保存的内容则如下图:

实际上接口实例中保存的内容,在反射(reflect)中体现的淋漓尽致,reflect所有的一切都离不开接口实例保存的内容。

go语言接口怎么写 第3篇

接口可以嵌套,嵌套的内部接口将属于外部接口,内部接口的方法也将属于外部接口。

例如,File接口内部嵌套了ReadWrite接口和Lock接口。

除此之外,类型嵌套时,如果内部类型实现了接口,那么外部类型也会自动实现接口,因为内部属性是属于外部属性的。

更多关于Go基础教程系列之Go接口的使用方法请查看下面的相关链接

抱歉,评论功能暂时关闭!