从 Node.js 到 Go
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
各类大全:https://github.com/avelino/awesome-go
- 使用RestSharp 库消费Restful Service
- Python-面向对像及其他
- 基于MongoDB GridFS的图片存储
- css3 过渡和2d变换——回顾
- Microsoft 防跨站点脚本库AntiXSS Library v4.2.1
- Compilify——让你在浏览器中编译.NET代码
- Python进阶-面向对象
- WCF RESTful服务的Google Protocol Buffers超媒体类型
- 使用CoreOs,Docker和Nirmata部署微服务类型的应用
- .NET 4 上的REST 框架
- 结合游戏开发与人工智能研究,游戏大厂 Ubisoft 成立AI研发部门
- Quartz.NET的管理工具
- Python-执行系统命令
- css3 UI 修饰——回顾
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android开发之绘制平面上的多边形功能分析
- Android Surfaceview的绘制与应用
- Android SQLite数据库版本升级的管理实现
- Android自定义view实现拖拽选择按钮
- Android 中ViewPager中使用WebView的注意事项
- Android IPC机制Messenger实例详解
- Android开发之文本内容自动朗读功能实现方法
- 深入理解Android中View绘制的三大流程
- Android LocationManager获取经度与纬度等地理信息
- springboot+freemarker+bootstrap快速实现分页功能(含java源码)
- Android 中Volley二次封装并实现网络请求缓存
- Android 实现无网络页面切换的示例代码
- RecyclerVIew实现悬浮吸顶效果
- 小程序地图学习之获取位置 获取经纬度 获取地名 获取地址
- 详解okhttp3 请求头不能为中文的坑