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接口的使用方法请查看下面的相关链接