Go
Go语言是谷歌2009发布的编程语言,它是一种并发的、带垃圾回收的、快速编译的语言。
它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。Go语言号称是云计算时代的C语言。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。
缘由
- 硬件发展快~~摩尔定律,主流编程语言发展效率跟不上硬件;
- 软件开发复杂度、维护成本越来越高,缺乏 足够简洁高效的编程语言;
- C C++ 运行速度快,但编译慢,还有内存泄漏问题。
成功元素
特性
* 并发
* 垃圾回收
* 高效的实现
* 给人以动态类型体验的静态类型系统
* 丰富但规模有限的标准库
* 工具化
* gofmt
* 在大规模系统中的应用
优势
- 语法简单,上手快;
- 性能高,编译快,开发效率也不低;
- 丰富的标准库;
- 原生支持并发,协程模型是非常优秀的服务端模型,同时也适合网络调用;
- 部署方便,编译包小,除 glibc 外没有其他外部依赖;
- 自带完善的工具链, 大大提高了团队协作效率和一致性。 比如 gofmt ,gofix,,govet 等工具。
Docker等很多 Go 产品的流行,更证明了 Go 语言的优秀。
适用场景
服务器编程,如:处理日志、数据打包、虚拟机处理、文件系统等;
分布式系统,数据库代理器等;
内存数据库,google开发的groupcache,couchbase的部分组建;
云平台,目前国外很多云平台在采用Go开发,如:CloudFoundy(VMware推出的业界第一个开源PaaS云平台)的部分组建。
成功项目
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的import包不支持版本,有时候升级容易导致项目不可运行,需要自己控制相应的版本信息;
Go的goroutine一旦启动之后,不同的goroutine之间切换不是受程序控制,需要严谨的逻辑;
GC延迟有点大,并发很大的情况下,处理很大的日志,GC 没有那么快,内存回收不给力,后来经过 profile 程序改进之后得到了改善;
没什么太多应用场景非要 Golang 才能做的 ( Golang 最大特点是异步和单进程跑多核 );
开发 web 没有 php ruby 成熟、快速;
开发 server 没有 java 现成解决方案多。