2.1 What?
- go语言是谷歌2009年发布的第二款开源编程语言(系统开发语言),是基于编译、垃圾回收和并发的编程语言
- Go语言有时候被描述为“C 类似语言”,从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想。
- Go 是编译型语言,使用编译器来编译代码。编译器将源代码编译成二进制(或字节码)格式;在编译代码时,编译器检查错误、优化性能并输出可在不同平台上运行的二进制文件。
特性:
- 语法简单
- Go语言的语法规则严谨,没有歧义,更没什么黑魔法变异用法
- 将“++”、“–”从运算符降级为语句,保留指针,但默认阻止指针运算,带来的好处是显而易见的。还有,将切片和字典作为内置类型,从运行时的层面进行优化,这也算是一种“简单”。
- 并发模型
- Goroutine 是 Go 最显著的特征。它用类协程的方式来处理并发单元,却又在运行时层面做了更深度的优化处理。这使得语法上的并发编程变得极为容易,无须处理回调,无须关注线程切换
- 搭配 channel,实现 CSP 模型。将并发单元间的数据耦合拆解开来,各司其职,这对所有纠结于内存共享、锁粒度的开发人员都是一个可期盼的解脱。
- 内存分配
- Go 选择了 tcmalloc,它本就是为并发而设计的高性能内存分配组件。
- 垃圾回收
- 标准库: 有很多好用丰富的标准库,比如net/http
- 工具链
- 完整的工具链对于日常开发极为重要。Go 在此做得相当不错,无论是编译、格式化、错误检查、帮助文档,还是第三方包下载、更新都有对应的工具。其功能未必完善,但起码算得上简单易用。
- 内置完整测试框架,其中包括单元测试、性能测试、代码覆盖率、数据竞争,以及用来调优的 pprof,这些都是保障代码能正确而稳定运行的必备利器。
2.2 Why?
- go之前,无论是汇编还是脚本语言,执行效率和开发效率不能兼得
- 兼顾python等动态语言的开发速度和和 C/C++等编译型语言的性能与安全性
- Go程序有着近C的执行性能和近解释型语言的开发效率,近乎于完美的编译速度,更加安全,支持并行进程。
- 设计哲学: 简单、实用体现得淋漓尽致
优点:
Go语言是集多编程范式之大成者,体现了优秀的软件工程思想和原则,其特性可以使开发者快速地开发、测试和部署程序,大大提高了生产效率。
- 相对 C/C++ ,Go语言拥有清晰的依赖管理和全自动的垃圾回收机制,代码量降低,开发效率提高。
- 相对 Java ,Go语言拥有简明的类型系统、函数式编程范式和先进的并发编程模型。代码块更小更简洁、可重用性更高,并可在多核计算环境下更快地运行。
- 对于 PHP ,Go语言更具通用性和规范性。更适合构建大型的软件,并能够更好地将各个模块组织在一起。在性能方面,PHP 不可与 Go 同日而语。
- 对于 Python/Ruby 来讲,Go 的优势在于其简洁的语法、非侵入式和扁平化的类型系统和浑然天成的多范式编程模型。与 PHP 一样,Python 和 Ruby 也是动态类型的解释型语言,这就意味着它们的运行速度会比静态类型的编译型语言慢很多。
Go语言对于当前大多数主流语言来讲,最大的优势在于具有较高的生产效率、先进的依赖管理和类型系统,以及原生的并发计算支持。
缺点:
- 语法方面不够简洁
- 并发方面可能会有门槛
- 垃圾回收角度看,Go语言的垃圾回收采用的是并发的标记清除算法(Concurrent Mark and Sweep,CMS),有延迟
- 第三方库不够多
使用go语言的项目:
- Docker:操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器。Docker 可以在一台物理服务器上快速运行一个或多个实例
- Kubernetes:Google 公司开发的构建于 Docker 之上的容器调度服务,用户可以通过 Kubernetes 集群进行云端容器集群管理。系统会自动选取合适的工作节点来执行具体的容器集群调度处理工作。其核心概念是 Container Pod(容器仓)
- etcd: 一款分布式、可靠的 KV 存储系统,可以快速进行云配置
使用场景:
- 服务器编程: 处理日志、数据打包、虚拟机、文件系统,分布式系统,数据库代理,中间件
- 网络编程: Web应用,API应用,下载应用等
- 云平台开发、区块链、嵌入式开发
下面列举了一些基于Go语言开发的优秀开源项目:
- 云计算基础设施领域,代表项目:docker、kubernetes、etcd、consul、cloudflare CDN、七牛云存储等。
- 基础软件,代表项目:tidb、influxdb、cockroachdb 等。
- 微服务,代表项目:go-kit、micro、monzo bank 的 typhon、bilibili 等。
- 互联网基础设施,代表项目:以太坊、hyperledger 等。