这是「知识星球」上一位球友提的问题。以下是我的回复。
Go 和 Java 都是 C 系语言,语法方面,存在很多相似的地方。Go 语言从 C 语言继承了很多,同时也抛弃了不少,改进了不少。
[h2]Go 从 C 继承了哪些重要特性,同时改进了哪些? [/h2]Go 跟 C 语言一样,语法足够简单。一些基础的语法,跟其他 C 系语言类似,从 C 继承了下来。和其他很多 C 系语言不一样的地方是,Go 继承了 struct,而且,不像 C++/Java,还额外提供 class。所以 C 语言的人,写 Go 会有很亲切感。
更重要的是,Go 对于 C 语言做了很多改进,而且这些改进很多由于历史原因导致的,作为一门全新的语言,没有历史包袱,完全可以在设计上做出改进。主要的改进有:
跟 C 一样有指针,但不允许进行指针运算,提升了安全性和易用性,很多 C 语言的开发者,对指针是有点头疼的,但接触 Go,会发现很容易使用指针;
有垃圾回收机制,从繁琐易错的内存分配和释放中解脱出来;
在 struct(类型)的基础上,引入方法的概念,相比 C 语言更利于结构化和管理;
更高级的数据结构原始支持,比如动态数组(slice)、string、map 等;
丰富的标准库支持,比如 Go 对于网络编程,标准库有了很大的支持,写起来会很简单,相对来说 C 使用第三方库,易用性也差一些;
一定程度上支持面向对象编程;
强大的工具链,编译速度超级快;
import 机制改进;
类型定义避免歧义,比如
var p, q *int
复制代码
;
更强大的 IDE 支持;
更强大、易用的并发支持;…
以上种种,会让 C 语言的开发者爱上 Go 语言。
对于 C++,因为其复杂性,我想面对 Go 这样简单、性能不错、C 系的语言,应该没有免疫力吧~
[h2]Java 为什么有时候会觉得 Go 别扭? [/h2]Java 虽然也是 C 系语言,但更多是面向对象的功能。很多设计模式的书,都是用 Java 语言来描述的。而 Go 语言,并非纯面向对象,只是一定程度上,支持了部分面向对象的特性,不少面向对象的功能缺失,这会让习惯 Java 的开发者感觉别扭。