go语言接口是什么 go 接口类型

为什么我不喜欢Go语言式的接口所谓Go语言式的接口,就是不用显示声明类型T实现了接口I , 只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方 。这种做法的学名叫做Structural Typing , 有人也把它看作是一种静态的Duck Typing 。除了Go的接口以外,类似的东西也有比如Scala里的Traits等等 。有人觉得这个特性很好,但我个人并不喜欢这种做法,所以在这里谈谈它的缺点 。当然这跟动态语言静态语言的讨论类似,不能简单粗暴的下一个“好”或“不好”的结论 。
我的观点:
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协议的一部分 。
『No8: Go 接口』 大家好 , 我是谢伟,是一名程序员 。
下面的学习是一个系列,力求从初学者的角度学会go 语言,达到中级程序员水平 。
这一系列是我的输出总结 , 同时我还推出了视频版 。正在制作过程 。
为写出这些文章,我阅读了网上诸多热门的教程和纸质书籍 。内容的实质都是那些,要区分出差异的话,只能表现在具体实例层面 。所以,实例我会选取自己在工作中的项目实例抽取出来 。希望对大家有所帮助 。
我们已经研究了:
本节的主题是:接口
接口是 golang 中最值得强调的特性 。它让面向对象,内容组织实现非常的方便 。
接口在 go 语言中是一系列方法的集合 , 原则上方法可以有很多个,但建议4个左右 。
上文中定义了一个 httpClient 的接口,指定了这个接口可以干这些活: Get、Post、Put、Delete
上文中指定了 httpClient 接口 , 指定了这个接口需要干的活是: Get、Post、Put、Delete ,具体的实现需要靠其他结构体来实现 。
一个结构体实现了接口要求的所有的方法(方法的参数和返回值一致),那么就说这个结构体实现了这个接口
上文中的使用: httpClient屏蔽了httpImpl的内部细节 , 而依然可以使用Get方法,去完成任务 。
当然接口可以被诸多结构体实现,只需存在接口定义的几种方法即可 。
接口和结构体的定义很相似,也可以完成嵌入接口的功能,嵌入的匿名的接口,可以自动的具备被嵌入的接口的方法 。
结构体实现String方法即可实现结构化输出结构体 。
实现Error 方法即可自定义错误类型 。

推荐阅读