没有停止学习脚步的程序员,这篇博客这要介绍为什么要学习go语言,go语言是一种新的语言,一种并发的,带垃圾回收的、快速编译的语言
不仅就有上述特点,更重要的是,在我面试几家公司之后,面试官反复提到如果会go语言的话会更好。(这样学习的动力马上就有)
Go有什么优势
- 可直接编译成机器码,不依赖其他库,glibc的版本有一定的要求,部署就是扔一个文件上去就完成。
- Go为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C风格include文件与库的开头。
- 它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。
- 静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出隐藏的问题,动态语言就是有很多包可以使用,写起来的效率很高。
- Go是静态类型的语言,它的类型系统没有层级。因此用户不需要在定义类型之间的关系上花费时间,这样感觉起来比典型的面向对象语言更轻量级。
- 语言层面支持并发,这个是go语言的最大特色,go就是基因里面支持的并发,可以利用多并发,很容易使用并发Goroutine 和 channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个Go应用也能有效的利用多个 CPU 核,并行执行的性能好。这和Python也是天壤之比。多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁GIL的原因,多线程的Python程序并不能有效利用多核,只能用多进程的方式部署;如果用标准库里的multiprocessing包又会对监控和管理造成不少的挑战(我们用的supervisor管理进程,对fork支持不好)。部署Python应用的时候通常是每个CPU核部署一个应用,这会造成不少资源的浪费,比如假设某个Python应用启动后需要占用 100MB 内存,而服务器有 32 个CPU核,那么留一个核给系统、运行 31 个应用副本就要浪费 3GB 的内存资源。
- 内置runtime,支持垃圾回收,并为并发执行与通信提供了基本的支持。
- 简单易学,Go语言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go关键字是25个,但是表达能力很强大,几乎支持大多数你在其他语言见过的特性:继承、重载、对象等。
- 丰富的标准库,Go目前已经内置了大量的库,特别是网络库非常强大
- 内嵌C支持,每一种语言像他会内嵌这么好。
小结
Go是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了
Go适合做什么
- 服务器编程,如果使用C或者C++实现的功能,利用Go来做很适合,例如处理日志,数据打包、虚拟机处理、文件系统等
- 分布式系统、数据库代理器
- 网络编程(这一块被应用的最广泛) web应用、API应用、下载应用
- 内存数据库,谷歌开发的groupcache,couchbase的部分组件
- 云平台,目前国外很多云平台使用Go开,CloudFoundy的部分组件,apcera云平台
Go成功的项目
- nsq:bitly开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息
- docker:基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。
- packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者
- skynet:分布式调度框架
- Doozer:分布式同步工具,类似ZooKeeper
- Heka:mazila开源的日志处理系统
- cbfs:couchbase开源的分布式文件系统
- tsuru:开源的PAAS平台,和SAE实现的功能一模一样
- groupcache:memcahe作者写的用于Google下载系统的缓存系统
- god:类似redis的缓存系统,但是支持分布式和扩展性
- gor:网络流量抓包和重放工具
Go的缺点
- Go的import包不包括版本,有时候升级导致项目不可行,所以需要自己控制相应的版本信息
- Go的goroutine一旦启动之后,不同的goroutine之间切换不是受程序控制,runtime调度的时候,需要严谨的逻辑,不然goroutine休眠,过一段时间逻辑结束了,突然冒出来又执行了,会导致逻辑出错等情况。
- GC延迟有点大处理很大的日志,GC没有那么快,内存回收不给力
- pkg下面的图片处理库很多bug,还是使用成熟产品好,调用这些成熟库imagemagick的接口比较靠谱