Go 中的 interface type (浅显理解)

Go 的设计确实很惊艳,不愧为「 21 世纪的 C 语言」。

Go 是静态强类型的,也就是说,在编译时会检查所有变量是否声明了类型,所有函数声明中形参是否声明了类型、返回值是否空、返回非空的话是否声明了类型,所有出现的函数调用中参数类型是否匹配、返回类型是否匹配并成功返回。

非常的严格到位,和 C 一样。

但类型的动态化又是一个必须得到满足的需求。在任何一门语言(至少我接触过的)中,这个问题都得到了解决, C 语言也不例外。

C 利用 void* 指针搭配 malloc() 函数,可以解决一切动态问题,无论是动态数据,还是动态方法,毕竟它们本质上都是一堆内存里的数据,而内存一旦被分配,我们就可以通过内存的地址(指针的值就是地址)索引到内存数据。

但 C 提供的太过底层,不够抽象,导致工程量很大,还很容易出错,尤其是对我这种水平弱鸡的程序员来说。

在这之后的语言,都有各自的解决办法。

Go 给出的 interface type 的解决方法特别惊艳。

interface 是一种数据类型,但这种数据类型存放的不只是所谓的数据,还有关于数据的类型以及绑定到数据之上的方法。

在 Go 中,数据和方法分离的很彻底:

数据可以通过 struct 类型自定义,并通过给函数指派接收者的方式给某一个数据类型绑定方法。当然,数据类型是可以嵌套定义的,方法随之被嵌套。

在这之后,就是 interface 发挥威力的时候了:interface type 可以凌驾在任何数据类型之上。

在这里, interface type 并不是某一个数据类型,而是「一大类」数据类型。这一大类数据类型的不同之处在于:包含的方法不同。

通过方法,可以在编译时检查静态类型是否匹配,并可以在运行时,动态检查并提取。

如何动态检查并提取呢?任何一种 interface 类型都会维护两方面的内容:

通过这种方式,interface 有什么好处呢?

在 interface 的作用下,我们终于可以在静态和动态之间取得一个十分良好的平衡:

差不多把我目前理解的 interface 全部讲出来了,浅显的很,但确实比 Java 丰富,比 Python 和 JS 来,机制也更清晰明了,虽然内部具体实现还是不清楚,但至少可以使用「指针」这个集抽象和具体操作于一体的概念进行一个脉络式把握。

补遗

interface 类型中的数据,不能直接拿到,而且不能通过直接的类型转换得到。

Go 提供了两个方法:

总结特点的话:


不知是该恭喜,还是该怎样,总之阅读到该文的,你是第 人。每一次刷新,都是不同的自己。