我从 1 年前开始关注 Golang,但一直没有时间细致地学习 Golang 的语法。
有关设计哲学,和语法的概览,我倒是看了不少,前两天买了一本《Go语言程序设计》,打算认真学习一下。
作为一个 C++ 出身的程序员,以及一个 Unix 粉,和一个开源主义者,Golang 的设计哲学相当得对我的胃口。
我对 Golang 的理解是“一个服务器端编程语言”,下面我来谈谈 Golang 吸引我的地方。
精心设计过的语法
这是和 PHP 比的,我之前一直在使用的 PHP 恐怕是流行的编程语言中,唯一一个语法没有经过精心设计的。
Golang 是由三位大牛共同设计的,它很年轻,没有历史包袱。
Golang 吸收了一些现代语言的语法,比如数组切片,多返回值等,但并不多,毕竟 Golang 的定位是工业级。
工业级
Golang 不是一个玩具,它甚至比很多流行的编程语言更加严肃,在和 Java 靠齐。
Golang 的语法设计就是为了让代码更加易读,而不是像 C++ 那样留给了大牛们很大的发挥空间。
Golang 自带代码格式化工具,要求所有代码都有一致的代码风格。
社区
Golang 的官网就是非常有活力的,首先就是一个 Hello World 和一个在线编译器。
目前 Golang 由 Google 牵头维护,包括 Google 在内的不少大公司都在使用 Golang.
文档,参考清晰地列在那里,第一时间提供给你了需要的信息,而且 Golang 还有个萌萌的吉祥物。
至于中文 Golang 社区的成长,也是相当迅速的,仅仅最近一年,就出现了两本完整的 Golang 中文教程,而且都是开源的。
本地代码和静态链接
知道 Linux 下最大的坑是什么么?就是动态链接库。
为什么 Linux 大部分软件都要求编译安装,就是因为动态链接库。
Golang 通过完全静态链接的方式避开了这个大坑。
同时 Golang 编译出的是本地代码,服务器无需环境即可运行。
没错,不需要任何环境,不需要任何动态链接库。
静态类型和接口
Golang 是一个静态类型语言,变量在编译时,就有一个唯一确定的类型。
因为 Golang 削弱了指针的功能,因此 Golang 甚至比 C/C++ 更加“静态”.
这使得 Golang 可以在编译时就进行完整的类型检查,在编译时就可以找到大部分的语法错误。
Golang 接口的创新在于,将描述接口的工作,从定义类的时候,转移到了使用对象的时候。
这使得 Java 等语言中原本繁琐的接口功能,在 Golang 中变得非常好用。
Golang 的类型系统建立在接口上,同时接口和静态类型检查也是紧密相关的。
简化的 OOP
C++,Java 中所谓的面向对象思想,略显复杂,Golang 则将 OOP 思想做了极大的简化,只留下了最核心的特征。
并发支持
Golang 的并发支持由 goroutine 和 channel 支持。
goroutine 是一种轻量级线程,目的是对 cpu 核心进行抽象,最大限度发挥多核心 cpu 的计算能力。
而 channel 是一种类似管道的线程间通讯机制,将经典的加锁模型,转换为了类似 Unix 进程间通讯的管道模型。
标准库
作为一个服务器端编程语言,Golang 的标准可以说非常全面,大部分的算法,协议都包括在了标准库中。
对于网络编程,Golang 几乎是开箱即用的。
而且 Golang 也借鉴了 Python 等语言的包管理器,安装软件包非常方便。
错误处理
Golang 没有传统的异常机制。 对于非致命的错误,Golang 使用返回值来报告(Golang 支持多返回值). 对于致命的错误,Golang 直接选择“崩溃”掉(当然也有恢复机制),不过按照 Golang 的哲学,既然是致命错误,就应当挂掉。 还有 defer 关键字,用于将一个语句“绑定”到函数退出时执行,无论是通过各种途径退出,这可是 C/C++ 里面的大问题。