首先谈一个问题,这个教程主要在讲什么?网上的免费电子书数不胜数,而且讲的非常详细和全面,我写的也不一定比他们的好,而且真的要写,得花很多时间。所以,我把这个教程定位成一个对Golang这门语言的布道或引导,关于技术细节可能讲的不算清楚,更多的是偏应用。
这篇文章我假设你拥有一定的计算机基础, 即使对Golang完全陌生,但是拥有其它编程语言的经验,比如PHP或Java。
一.简介
Go 语言起源 2007 年,并于 2009 年正式对外发布,该项目的三位领导者均是著名的 IT 工程师:Robert Griesemer,参与开发 Java HotSpot 虚拟机;Rob Pike,Go 语言项目总负责人,贝尔实验室 Unix 团队成员,参与的项目包括 Plan 9,Inferno 操作系统和 Limbo 编程语言;Ken Thompson,贝尔实验室 Unix 团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开发了 UTF-8 字符集规范
简单说,Golang是Google主导,背后由一群大牛的操刀设计的新时代编程语言,虽然比较年轻,但是前景还是非常明朗的。
二.优点
Golang经常被人称为“21世纪的C语言”,它的设计参考了C、C++、Java等流行编程语言,从语言类型上说,Golang是属于静态编译型语言。虽然在语法上,Golang和大多数C系编程语言都差不多,但是我认为Golang以下优点值得一说:
- 简单,容易上手。如果了解过C++或Rust就会知道,其语言特性之多,语法之复杂,令人生畏,Golang还去除了C里面最难理解的指针操作。
- GC。C、C++在编程的时候需要手动管理内存,这导致编程复杂,而且容易出现内存泄露问题,Golang自带高效的GC机制,堪比jvm。
- 高性能。拥有GC的语言很多,大部分动态语言,比如PHP、JS、Python都有GC,但是拥有GC并且高性能的语言并不多,比如Java,但是Java过于笨重。Golang的性能稍低于C,但是和Java可以一战。
- 并发编程。这个估计是Golang最为出名的特性,基于goroutines 和 channels 能够实现一个非常简单的并发编程模型。Go的协程又被称为用户态线程,单机可以轻松开启百万协程,非常适合网络编程。
- 资源占用低。Go在内存占用方面大概可以和C++媲美,比Java要少几倍,网上看过一篇文章说知乎核心业务使用Golang重构后节省了80%的服务器资源(之前使用的是Python)。
其它优点: 部署简单,这个是相对于Java、PHP来说的,Go的应用可以直接编译成二进制文件放在任何一台电脑上都能跑,而Java运行少不了笨重的JVM,PHP更是一堆扩展。跨平台,Golang跨平台交叉编译非常简单,build的时候加个参数就行,无论是x86、amd64、darwin、freebsd、还是arm平台都能跑,我家路由器上面就跑了一个Go的程序。编译速度快,确实非常快,如果做安卓开发的同学应该比较了解Java的编译速度。代码风格强制规范,这一点在大型项目的开发中比较好,强制你遵循一定规范,便于合作开发。
三.缺点
说完优点说说缺点吧:
if err != nil
总得来说,这些缺点并不是致命的缺点,更像是语言特性上的缺少,有利也有弊,毕竟Go还比较年轻,而且Go社区也在考虑完善这些问题。
四.应用场景
说到应用场景,这里先说说一些Go写的知名开源项目:
- docker。这个就不多说了,最火的就是这个
- kubernetes。常说的k8s就是这个,是用来调度和管理docker集群的管理系统
- gogs。一款基于git的代码托管系统,类似于github和gitlab,不过其小巧易用,功能强大,部署方便
- syncthing。开源的文件同步系统,它使用了其独有的对等自由块交换协议,速度很快
- grafana。一款开源监控度量的看板系统
- etcd。一款分布式的,可靠的K-V存储系统,使用简单,速度快,又安全
- beego。国产开源的高性能Web框架,让你快速的开发Go Web应用服务
- influxdb。可伸缩的数据库,使用场景主要用来存储测量数据,事件点击以及其他等实时分析数据
从上面可以看出来,大部分都是基于网络的应用,实际也是这样,目前Go主要用在网络编程上面,虽然Go的性能很好,但是并不适合拿来写OS或者GUI应用,虽然也有人尝试过这样做。
说到网络编程就不得不说Web编程,利用Go的协程,轻轻松松写出高并发的Web应用,目前Go的Web框架的也很多,比如gin、beego、echo,可用性都很高,虽然开发速度和灵活性上面比PHP等动态语言差一点,但是性能上无可挑剔。另外,Go也可以用于服务器编程,比如说处理日志、分布式数据库的开发,还有很多云平台也是使用Go开发。
五.学习资源
虽然接下来的教程我会带领大家学习,但是本教程讲的不会太细,如果你想仔细学习Go语言,我建议你可以参考下面的资源: