所谓Go语言式的接口,就是不用显示声明类型T实现了接口I,只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做Structural Typing,有人也把它看作是一种静态的Duck Typing。除了Go的接口以外,类似的东西也有比如Scala里的Traits等等。有人觉得这个特性很好,但我个人并不喜欢这种做法,所以在这里谈谈它的缺点。当然这跟动态语言静态语言的讨论类似,不能简单粗暴的下一个“好”或“不好”的结论。
成都创新互联从2013年创立,先为灌阳等服务建站,灌阳等地企业,进行企业商务咨询服务。为灌阳企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
我的观点:
Go的隐式接口Duck Typing确实不是新技术, 但是在主流静态编程语言中支持Duck Typing应该是很少的(不清楚目前是否只有Go语言支持).
静态类型和动态类型虽然没有绝对的好和不好, 但是每个都是有自己的优势的, 没有哪一个可以包办一切. 而Go是试图结合静态类型和动态类型(interface)各自的优势.
那么就从头谈起:什么是接口。其实通俗的讲,接口就是一个协议,规定了一组成员,例如.NET里的ICollection接口:
public interface ICollection {
int Count { get; }
object SyncRoot { get; }
bool IsSynchronized { get; }
void CopyTo(Array array, int index);
}
这就是一个协议的全部了吗?事实并非如此,其实接口还规定了每个行为的“特征”。打个比方,这个接口的Count除了需要返回集合内元素的数目以外,还隐含了它需要在O(1)时间内返回这个要求。这样一个使用了ICollection接口的方法才能放心地使用Count属性来获取集合大小,才能在知道这些特征的情况下选用正确的算法来编写程序,而不用担心带来性能问题,这才能实现所谓的“面向接口编程”。当然这种“特征”并不但指“性能”上的,例如Count还包含了例如“不修改集合内容”这种看似十分自然的隐藏要求,这都是ICollection协议的一部分。
因为结构Student和Teacher实现接口Human的方法SayHello时,接受的是通过一个指针类型的变量(见(s *Student)和(t *Teacher))来调用这个方法。因此,在调用SayHi函数时,只能传递Student或Teacher的对象的地址,传递它们的对象是错的。
相反,如果结构Student和Teacher实现接口Human的方法SayHello时,接受的是通过一个对象(像(s Student)和(t Teacher))来调用这个方法。则在调用SayHi函数时,既能传递Student或Teacher的对象,也能传递Student或Teacher的对象的地址。
vi. 走;达到;运转;趋于
n. 去;进行;尝试
vt. 忍受;出产;以…打赌
[复数 goes 第三人称单数 goes 过去式 went 过去分词 gone 现在分词 going]
在正常的测试中,当我们需要进行接口测试时,通常使用接口调试工具,如postman进行接口测试
目前我在尝试使用Go语言进行接口测试,使用的库均为Go自带的库。
注:当前采用的接口为时事新闻接口,每天可以请求100次,需要的同学,可以自行使用。
最近写了个kafka的接收消息的功能,需要使用回调处理收到的消息。
一个是基本的回调,一个是使用接口功能实现回调,对接口是个很好的学习。
1.正常回调
kafka的接收消息处。收到消息后,使用传入的Onmessage进行处理。
调用kafka接收消息的单元,并在调用方写好回调
在调用方实现回调需要执行的方法
感觉还是使用基本回调相对简单点,接口就当学习了。
另外跨包的接口的方法要大写!定位了好久发现个入门的问题。
你说的应该是这样:
var User interface{}
这个是空接口,代表任意类型的意思,因为所有类型都满足空接口