golang devops项目实战 - 为何选择go语言

先来聊聊go有趣的历史

在google中,大部分的项目都是采用C C++开发,少许地用了java,其次 才是python;在2007年的某一天,google的首席工程师在编译一个C++项目 过程当中,尽管在google早就实现了分布式编译系统,可是Rob Pike和Robert Griesemer实在受够了那个漫长的编译等待时间,因而突发灵感与坐在旁边的 Ken Thompson一块儿讨论实在有必要发明一个新的编程语言,这个编程语言必 须有近乎C语言的执行效率和近乎解析型语言的开发效率,以及近乎完美的编译 速度,因而他们取名这个语言为go语言,就如每个go语言的使用者都成为 gopher,gopher是一种生活在加拿大的小动物,它的中文名叫作囊地鼠,这 种动物有个特色就是生活在底下,哈哈,固然这个不是最关键的,他们最大的 特色就是挖洞速度特别快,固然可能不止是挖洞啦,取名为go意为语言的运行 速度、开发速度、学习速度(develop)都像gopher同样快。html

 

 

被称为GO语言之父的Rob Pike说,你是否赞成GO语言,取决于你是承认 少就是多,仍是少就是少(Less is more or less is less)。Rob Pike以一种很是 朴素的方式,归纳了GO语言的整个设计哲学--将简单、实用体现得淋漓尽致。java

不少人将GO语言称为21世纪的C语言,由于GO不只拥有C的简洁和性 能,并且还很好的提供了21世纪互联网环境下服务端开发的各类实用特性,让 开发者在语言级别就能够方便的获得本身想要的东西。python

强大的研发团队

go的应用c++

使用go语言开发的开源项目比较著名的主要有:git

Docker,火热的容器化技术; Kubernetes,Goole Borg的开源实现; Etcd,相似zookeeper的高可用key-value存储; TIDB,国人开发的Google spanner的开源实现;程序员

许多大厂都已经拥抱 Go 语言,包括以 Java 打天下的阿里巴巴,更别提深 爱着 Go 语言的滴滴、今日头条、小米、奇虎 360、京东等明星公司。同时, 创业公司也很喜欢 Go 语言,主要由于其入门快、程序库多、运行迅速,很适 合快速构建互联网软件产品,好比轻松筹、快手、知乎、探探、美图、猎豹移 动等等,更好比前不久泄漏的B站后端源码都是采用go语言开发。github

从业务维度看,在云计算、微服务、大数据、区块链、物联网等领域,Go 语言早已蓬勃发展。有的使用率已经很是之高,有的已有一席之地。即便是在 Python 为王的数据科学和人工智能领域,Go 语言也在缓慢渗透,并初露头 角。golang

go的特性web

  • 并发与协程
  • 基于消息传递的通讯方式
  • 丰富实用的内置数据类型
  • 函数多返回值
  • defer机制
  • 反射(reflect)
  • 高性能HTTP Server
  • 工程管理
  • 编程规范

为何要选择go语言

你为何选择这门语言去开发,关于这个话题,永远是争议最大的,好比 程序员鄙视链,可是我在开讲go语言以前仍是要来趟这个浑水,若是有失偏颇 的话,还请海涵。首先存在即合理,那么多的计算机语言存在,都会有其时代 背景和对软件工程中某些特殊问题的解决,不能一棍子敲死,好比C/C++牛 逼,那为何java的应用范围很是广,java程序员的数量多过C/C++,java看 起来被这么多人如此使用,那为何如今愈来愈多的企业转向用go语言开 发?!redis

从如下三个方面来阐述下:

首先,对于架构师来说,他应该是精通的领域较广,对技术了解比较深 刻,那么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语言社区。

https://www.bilibili.com/video/av57709660

相关文章
相关标签/搜索