写了一个月的插件,发现interface这个关键词几乎没怎么用,然后好奇,打开了gjson的源码,发现gjson的源码用的也很少,最多的用法是相当于java中的object。我开始思索,为什么需要Interface,而不是一个object(写到这里,我想起了被C语言里void* 支配的恐惧)。
个人感觉interface中翻译成接口是有点令人费解。正如handler译成句柄,貌似当时是写错了,勾被看错成句,handler,勾柄,就是门把手,socket就是插座的意思。
对interface(接口)最基本的印象,是fmt.Println这个方法,当时就觉得很神奇,真要实现了String方法,就可以被打印出来。现在写多了程序,就发现,“接口即合约”。
我看到IO里reader/writer的实现,都是用的interface,我也试者去编写自己的 reader/writer,然后当做一个变量去传递。也许是我最近的工作都是在一个包里进行、也不用进行传递,更不用说什么struct的交换。
更权威的总结如下:
An interface is a kind of contract which the implementing type(s) must fulfill. Interfaces describe the behaviorof types, what they can do. They completely separate the definition of what an object can do from how it does it, allowing distinct implementations to be represented at different times by the same interface variable, which is what polymorphism essentially is.
Writing functions so that they accept an interface variable as a parameter makes them more general.
《The Way to Go》
野生翻译如下:
接口是一种必须要全部实现(所申明函数)的约束。接口定义了类型的行为,即:“它们可以做什么”。与“一个对象怎么去做”的定义完全不一样,他允许在不同的时间里,相同的接口变量代表着不同的实现,这就是Go多态性的本质。写方法时,让他们接收接口类型,就像平常的传递一个参数那样。
总结interface
- 处理未知的数据类型
- Golang的泛型
写了这么久的Golang,我在想,以前java/C++那一套,构造函数,重载,也并不是真的就那么的必要。但是无比怀念Java的泛型,还有gradle。
有疑问加站长微信联系(非本文作者)