Go 是一个具有高性能、高并发、跨平台的语言,正在得到越来越来广泛的关注与应用。俗话说,技多不压身,多掌握一门语言也就意味着在应用开发的时候拥有了更丰富的选择余地。本文将会站在 node.js 开发者的立场上对比介绍一些 Go 的特性,从而帮助大家快速了解 Go 语言。
01
—
1、静态类型
Node.js 是动态类型:
let a = '1'; a = 2; console.log('3' == 3);
上面的代码中,a 本来是一个 string 类型的变量,然而它可以直接被重新赋值为一个 number 类型,同时 string 与 number 这两个不同的类型也可以直接进行相等判断(会自动进行类型转换)。这些都说明 node.js 是动态类型的语言。
然而 Go 是静态类型,这意味着你无法直接将某个类型的值赋值给另一种类型的变量(需要使用特定的类型转换方法),也无法在不同的类型上进行相等判断。
静态类型有益于构建大型应用,提高可靠性,排除不稳定因素。Typescript 的广泛应用也反映出开发者对于强类型系统的迫切需要,而 Go 本身就是静态类型。
2、编译型语言
Go 是一个编译型的语言,这意味着我们需要对代码进行编译,生成一个可执行的二进制文件,然后直接执行这个二进制文件就行了,在部署时也只需要这一个可执行文件就够了。
Node.js 是一个解释型的语言,没有编译这个过程,它是在运行时不停的解释程序然后执行获取结果。解释型就好像吃火锅一样,一遍涮菜一边吃,而编译型就好像吃家常菜一样,全部做好了直接吃,这种差异也导致了解释型语言的效率要低于编译型语言。
解释型的语言执行需要有运行环境的支持,说白了就是你必须要有代码,同时配置好运行所需要的各种环境(比如 node.js 和其它各种依赖库),而 Go 不需要这些,它只需要一个编译生成的二进制可执行文件就行了。当然针对不同的系统,Go 可以进行交叉编译。总之 Go 的性能很高,同时也是跨平台的,具有很好的移植性。
3、gofmt 强制代码格式
Node.js 并没有规定代码格式,所以在实际编程过程中,我们可能会引入各种不同的第三方库,然后形成五花八门的代码格式。
Go 本身自带的工具链 gofmt 就强制规定了代码格式,无需依赖第三方库,同时也避免了格式之争,有助于大型项目的维护及多人协作。
4、第三方库
Node.js 的繁荣离不开 npm 的卓越贡献,npm 上托管了庞大繁杂的第三方库,这意味着我们可以利用这些第三方库快速构建我们的应用,然而带来的问题就是,第三方库质量的参差不齐也会为我们的服务埋下隐患。
相比于 npm ,Go 并没有对等的东西,开源的第三方库几乎都托管在 GitHub 上,然而 Go 本身自带的标准库非常强大,换句话说,不需要第三方库你就可以做很多事情,其次你需要的 GitHub 上也都有。
5、包管理
Node.js 的 npm 既是一个托管平台,也是一个包管理工具,而 Go 的包管理一路走来直到 1.11 版才有了官方正式的包管理工具 go modules(推荐使用),当然这个问题现在来说其实也无伤大雅。
因为墙的原因,网络问题可能会导致某些源拉取不了,这个问题官方也在 1.11 版本进行了解决,方法很简单(需要使用 go modules ),只需要设置一个环境变量即可:
export GOPROXY=https://goproxy.io
6、node.js 的工具
Go 编程,我们同样可以使用 nodemon 和 pm2 这样的工具,nodemon 配置 exec 为 go run 即可,而 pm2 需要注意只能使用 fork 模式(因为 cluster 模式是依赖于 node.js 的)。
02
—
官方入门教程:https://tour.golang.org
在线平台,不用安装即可在线运行:https://play.golang.org
针对 node.js 开发者的学习示例(强烈推荐):
https://github.com/miguelmota/golang-for-nodejs-developers
项目布局参考:https://github.com/golang-standards/project-layout