先来聊聊go有趣的历史
在google中,大部分的项目都是采用C C++开发,少量地用了java,其次 才是python;在2007年的某一天,google的首席工程师在编译一个C++项目 过程中,尽管在google早就实现了分布式编译系统,但是Rob Pike和Robert Griesemer实在受够了那个漫长的编译等待时间,于是突发灵感与坐在旁边的 Ken Thompson一起讨论实在有必要发明一个新的编程语言,这个编程语言必 须有近乎C语言的执行效率和近乎解析型语言的开发效率,以及近乎完美的编译 速度,于是他们取名这个语言为go语言,就如每一个go语言的使用者都成为 gopher,gopher是一种生活在加拿大的小动物,它的中文名叫做囊地鼠,这 种动物有个特点就是生活在底下,哈哈,当然这个不是最关键的,他们最大的 特点就是挖洞速度特别快,当然可能不止是挖洞啦,取名为go意为语言的运行 速度、开发速度、学习速度(develop)都像gopher一样快。
被称为GO语言之父的Rob Pike说,你是否同意GO语言,取决于你是认可 少就是多,还是少就是少(Less is more or less is less)。Rob Pike以一种非常 朴素的方式,概括了GO语言的整个设计哲学–将简单、实用体现得淋漓尽致。
很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性 能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让 开发者在语言级别就可以方便的得到自己想要的东西。
强大的研发团队
go的应用
使用go语言开发的开源项目比较著名的主要有:
Docker,火热的容器化技术; Kubernetes,Goole Borg的开源实现; Etcd,类似zookeeper的高可用key-value存储; TIDB,国人开发的Google spanner的开源实现;
许多大厂都已经拥抱 Go 语言,包括以 Java 打天下的阿里巴巴,更别提深 爱着 Go 语言的滴滴、今日头条、小米、奇虎 360、京东等明星公司。同时, 创业公司也很喜欢 Go 语言,主要因为其入门快、程序库多、运行迅速,很适 合快速构建互联网软件产品,比如轻松筹、快手、知乎、探探、美图、猎豹移 动等等,更比如前不久泄漏的B站后端源码都是采用go语言开发。
从业务维度看,在云计算、微服务、大数据、区块链、物联网等领域,Go 语言早已蓬勃发展。有的使用率已经非常之高,有的已有一席之地。即使是在 Python 为王的数据科学和人工智能领域,Go 语言也在缓慢渗透,并初露头 角。
go的特性
并发与协程
基于消息传递的通信方式
丰富实用的内置数据类型
函数多返回值
defer机制
反射(reflect)
高性能HTTP Server
工程管理
编程规范
为什么要选择go语言
你为什么选择这门语言去开发,关于这个话题,永远是争议最大的,比如 程序员鄙视链,但是我在开讲go语言之前还是要来趟这个浑水,如果有失偏颇 的话,还请海涵。首先存在即合理,那么多的计算机语言存在,都会有其时代 背景和对软件工程中某些特殊问题的解决,不能一棍子敲死,比如C/C++牛 逼,那为什么java的应用范围非常广,java程序员的数量多过C/C++,java看 起来被这么多人如此使用,那为什么现在越来越多的企业转向用go语言开 发?!
从以下三个方面来阐述下:
首先,对于架构师来讲,他应该是精通的领域较广,对技术了解比较深 刻,那么python、java、c、c++、lua、go比较了解,根据业务场景去选择开 发语言,比如网易云风,在架构网易游戏的时候就大量低使用了lua语言,因为 lua动态解释的,简洁小而美,方便做热更新,方便作为实现业务逻辑的,是 c、c++各模块之间的粘合剂,比如web开发;java有很多成熟的库,开发效率 比较高;比如音视频相关的开发,用C和C++,因为很多图像处理、编解码、 音效处理大多采用了C/C++开发,你再用java开发就是不伦不类的。
其次,对于软件工程来讲,注重研发效率和合理适度的架构设计,在这方 便,C和C++对于移动互联网和物联网后台服务以及基础架构设计来讲,因为 能够直接操作内存,比如内存溢出、栈溢出、内存泄漏、野指针操作等会导致 应用程序直接崩溃,而更加的是这些问题可能隐藏比较深,定位BUG和解决的 成本较大,所以对开发人员的技能要求比较高,那么如果在一个团队内没有严 格的管理,用C和C++开发的工程代码极难维护。现在很多的后台应用使用java 语言开发,但是java的框架和组件非常多,这十分容易引起过度化设计。
再者,对于企业和行业现状来讲,很多的企业都面临高并发和大数据的请 求,对于并发或者并行开发,python就免谈了,压根不合适,但是对于java语 言或者C/C++语言来讲,如果采用多进程和多线程的方式,采用这种方式时, 很多时候我们采用锁的机制解决问题,但是采用锁带来的成本是很大的(可见 http://47.106.79.26:4000/2018/11/28/kernel_mutex/ 对mutex的分析), 采用多线程最著名的《并发危险:解决多线程代码中的 11 个常见的问题》( https://blog.csdn.net/mergerly/article/details/39028861)。那么在业界内 我们采用的比较多的是lock-free的方案,比如自旋锁和原子操作等,例如 Disruptor。几年前我接触了ZeroMQ的设计,从ZeroMQ的主要贡献者Pieter Hintjens里了解到最好的并发方式,是不共享任何资源,如果真要共享资源则 可以设计为线程通信的方式去解决。那么我们也看到go语言里实现的协程,以 及协程间用channel去通信的设计。
论述完以上三点,那go语言又有哪些优势呢?
性能:go语言是一门静态语言,编译成机器字节码,java虽然有JVM,但 是java也有JIT,可以生成字节码去执行。C和C++也是静态语言,直接编 译生成机器字节码,所以go在语言层面的性能是接近C和C++的。关于语 言性能的比较我们可以从 https://benchmarksgame- http://team.pages.debian.net/benchmarksgame/fastest/go.html略窥一 二。但是在应用一门语言时,语言的性能仅仅是一个方面,还跟其它方面 有关系:比如跟写代码的人的水平和方式有关( Will your toy benchmark program be faster if you write it in a different programming language? It depends how you write it!);其二在内存管理和IO操作上,这个就不 是语言层面能够控制的了,比如C/C++能够自己实现内存的管理,比如内 存池的技术,所以对于后台服务的应用程序需要海量请求时,可以从内存
池的技术上去优化性能,相对来说go语言和其它高级语言没有指针的这个 操作,所以在这方面还是不如C/C++的;其三,应用程序的性能也符合 28原则,我们更应当将注意力集中在频繁被执行的代码上。
go还提供了一些性能分析工具(比如pprof),通过这些工具可以分 析程序CPU使用、内部使用,查看协程栈、GC日志和Trace信息。 语言技术栈:首先,go语言里内置了很多的package,从其官网( https://golang.org/pkg/)可以查看到,基于这些package可以足够开 发出你的应用了,所以go语言是比较反对框架的;但是你也可以引入第三 方的package,如首先执行: go
get http://github.com/garyburd/redigo/redis,然后import这个package, 就可以使用这个package了,现在很多组件都提供了go语言版本的接口, 也有很多第三方的框架,比如web服务的beego、buffalo、echo、gin、 iris和revel,比如微服务的非常著名并且性能彪悍的grpc,分布式文件系 统的go-fastdfs,对于很多的其它方面的应用都有go语言的接口实现。 开发效率:
编译效率高,go语言的设计的初衷之一就是解决C/C++混乱的头文 件依赖机制所导致的编译时间过长问题,在GO语言中,有一套标准 的工程管理规范,只要按照这个规范进行项目开发,之后的事情 (比如包管理、编译等等)都将变得非常的简单。在GO项目下,存 在两个关键目录,一个是src目录,用于存放所有的.go源码文件; 一个是bin目录,用于存在编译后的二进制文件。在src目录下,除 了main主包所在的目录外,其它所有的目录名称与直接目录下所对 应的包名保持对应,否则编译无法通过。这样,GO编译器就可以从 main包所在的目录开始,完全使用目录结构和包名来推导工程结构 以及构建顺序,避免像C++一样,引入一个额外的Makefile文件。 在GO的编译过程中,我们唯一要做的就是将GO项目路径赋值给一 个叫GOPATH的环境变量,让编译器知道将要编译的GO项目所在的 位置。然后进入bin目录下,执行go build {主包所在的目录名},即 可秒级完成工程编译。
一处编译到处运行, Go编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖。(够浪) 学习成本:go语言的设计者,一开始就遵守少就是多的原则,所以 go语言没有太多的特性,不像C一样需要控制内存,也不像 C++11/14/17/20一样引入了特别多的语法特性,go的代码比较简 单,学习的成本比较低。除此之外我们可以从官网和社区获取到很 多的帮助。
Golang官网
Golang官方地址: http://golang.org,无论学习什么知识,第一手资料 基本都是首发于官网。进入到官网后,会看到很多资源,比如:
文档:http://golang.org/doc,官方文档,仔细读下文档首页并分 类,了解下自己要学哪些内容; 一览:http://tour.golang.org,交互式运行环境,不安装golang便 可体验学习它的语法与使用; 指南:http://golang.org/ref/spec,golang学习指导手册,从基础 语法到高级特性全部都有介绍;
标准库:http://golang.org/pkg/,可以查看所有的官方库的接口、 源码以及使用介绍; 博客:http://blog.golang.org,不定期分享go的最佳实践,有些公 司也会投稿介绍自己的案例; 实验室:http://play.golang.org,感觉和tour类似,不过在这里编 写的代码可以分享给别人;
官网是个宝库,我们需要认真仔细去挖掘其中的内容;但由于一 些原因,golang的官方站点我们无法访问,不过golang为我们提供了中国的官 网,地址: https://go-zh.org;
golang社区
一门语言的发展需要有大批牛人的分享布道,也需要我们这些菜鸟学习有更多 的参考路径。这一切都离不开社区。国内外也有很多优秀的go语言社区。
go语言视频详解:https://www.bilibili.com/video/av57709660