Go 中的 method, interface and channel
结合网上的一些说法,以及自己的真实体会,学过 Python 之后再学 Go,真是感觉无法舒心。有一个非常直接的感受:Go 当然有静态语言的优点:严谨,此外还简洁,同时还有动态语言的优点:灵活省人力。
如果与 C 或 Java 相比对的话,Go 的静态或许只体现在需要提前编译上了。
在编程的时候,最重要的工具无疑是数据结构和类型系统,基于这两个工具,才可以谈工程算法和编程思想。虽然就其本质而言,算法和思想可以脱离具体编程语言而存在,但它们发挥威力的时候必然是以数据结构和类型系统为基础架构起来的。
编程语言虽不能完全左右数据结构和类型系统,但本身的确提供了一套最为精要的数据结构和类型系统。当我们使用一门具体的编程语言时,必须使用这门语言提供的数据结构和类型系统来进一步构建我们需要的更高级的数据结构和类型。当然,对于高手,或许并没有本质区别,但至少会耗费精力吧?更为关键的是,这个世界上,并没有太多高手,大多数人都会处于编程语言本身的禁锢之中,程度不同而已。
所以,越是菜鸟,越应该多学多了解几门各具特色的编程语言,以此强迫自己跳脱某门具体的编程语言本身,慢慢形成自己对编程本身的思考,慢慢沉淀下来的东西才是最可贵,也最有价值的编程知识。
在 Go 这门语言中,最具特色的便是方法,接口和通道。
它们非常优雅地实现了编程领域的两个关键问题:
- 类型系统
- 自定义数据类型
- 在数据类型上定义并实现方法
- Go 将数据类型中的 value 和 type 完全分离:定义和实现均分离
- 并发运行
- 并发本身是未来的强需求
- 但或许此需求本身的关键点还不在性能,而是共享与通讯
- 绝大多数并发,其实并不需要追求性能,只是逻辑上的并发而已
- 而逻辑上的并发,最关键的是如何共享数据,也就是如何通讯
- Go 利用管道成功解决此问题
回过头来再看方法,接口和通道,会发现它们其实一点不特殊,却成功而优雅地解决老大难问题。
- 方法只是指定了接收者的函数,相当于把形参部分特殊化处理
- 接口和通道呢,本质上就是一种数据类型,只是这种数据类型可以包含多种基础的数据类型和其相应的值以及所具备的方法(最后这个是接口独有)
这么看过去,真是一片清凉呢。
不知是该恭喜,还是该怎样,总之阅读到该文的,你是第 人。每一次刷新,都是不同的自己。