我是从2016年5月开始用Go开发的,在这之前用了十年左右的C/C++和4年左右的Java,偶尔也用Python做点小项目。今天想跟大家聊一聊,用Go做互联网后台开发的好处。
什么是Go
Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.
这是Go官网对Go的定义,翻译过来就是:Go是一门开源的编程语言,Go让编写简洁、可依赖和高效的软件变得简单。
Go是2007年在Google被发明的,2012年3月28日发布了1.0版本,现在已更新到1.8版本了。发明人中就有程序员的男神Ken Thompson,他在1969年和Dennis Ritchie 一起设计和实现了Unix操作系统。
谁在用Go
从TIOBE给出的2017年5月编程语言排名来看,Go是增长最快的语言,一年内+1.83%并且从42名提升至16名。
2012年,七牛就已经在用了,核心系统也是用Go实现,七牛的创始人许世伟是Go在国内的布道者。现在国内用Go的不少,看到BAT某部门的后台开发岗位,要求应聘者有Go开发经验。
现在很火的微服务的两大基础组件:Docker和Kubernetes都是用Go实现的。
Go的优势
1, Concurrency的原生支持
通过语言原生的Goroutine和Channel,很好的支持了Concurrency。你可以把Goroutine理解为非常轻量级的Thread。
- 一个Goroutine只占用2KB的内存,但是一个Thread要占用1MB的内存。
- Goroutine的创建、销毁和切换的开销,相对于线程来说特别低。你可以随时起上千个Goroutine,这会让你的编码变得异常简单。
- Go runtime处理所有跟Goroutine相关的操作,实际上Goroutine也是跑在操作系统的Thread上。
2, Go的依赖管理
对于C/C++和Java而言,依赖管理是一个让大多数新手抓狂的问题,你需要去编写CMakeLists.txt/Makefile或配置Maven。
Go的依赖管理很简单:
- 定义一个根目录$GOROOT,来保存你所有的代码。
- 你的代码和依赖,按照Go的约定,放在固定的相对路径下。go get命令能帮你下载所有依赖的package。
Go也有一些依赖管理的工具,我现在用的是glide。
3, 静态链接
部署C/C++服务的朋友一定很熟悉静态链接和动态链接的概念。服务器部署的时候,动态链接库的管理也是个很麻烦的事情,经常本地可以跑的,换个服务器就不行了。Docker的出现,一定程度上简化了这个问题。
Go默认使用静态链接的方式编译,所以在部署的时候特别方便,只需要拷贝单个二进制文件就可以了。
4, Go的工具链
Go官方支持的工具链很齐全很好用,常用的包括测试,Benchmark,性能调优等。一个成熟的开发流程中,编码只会占用少量时间,更多时间都花费在测试和调优上,所以好用的工具链对提升效率很重要。
5, Go的社区
Go背后有Google撑腰,同时也有一个非常健康和活跃的开源社区。官方package本身就很强大,社区还贡献了大量好用的组件。另外Go的文档和优秀的Blog也很多,学习成本较低。
在后台开发中,除了一些特定的场景需要用C/C++,比如CUDA、CPU密集的或IO密集的以外,其他的都可以尝试用Go。