Featured image of post 为什么学习Golang?

为什么学习Golang?

Golang —— 让你用写Python代码的开发效率编写出C++代码的性能

背景知识

Go语言(或Golang)是Golanguage的简称,Go是Google的Ken Thompson,Rob Pike以及Robert Griesemer开发的一种静态强类型、编译并发型语言,

Go语言创始人

对语言进行评估时,明白设计者的动机以及语言要解决的问题很重要。Go语言出自 Ken Thompson 和 Rob Pike、Robert Griesemer 之手,他们都是计算机科学领域的重量级人物。

  • Ken Thompson

贝尔实验室 Unix 团队成员,C语言、Unix 和 Plan 9 的创始人之一,在 20 世纪 70 年代,设计并实现了最初的 UNIX 操作系统,仅从这一点说,他对计算机科学的贡献怎么强调都不过分。他还与 Rob Pike 合作设计了 UTF-8 编码方案。

  • Rob Pike

Go语言项目总负责人,贝尔实验室 Unix 团队成员,除帮助设计 UTF-8 外,还帮助开发了分布式多用户操作系统 Plan 9、Inferno 操作系统和 Limbo 编程语言,并与人合著了《The Unix Programming Environment》,对 UNIX 的设计理念做了正统的阐述。

  • Robert Griesemer

就职于 Google,参与开发 Java HotSpot 虚拟机,对语言设计有深入的认识,并负责 Chrome 浏览器和 Node.js 使用的 Google V8 JavaScript 引擎的代码生成部分。

Go语言创始人

这些计算机科学领城的重量级人物设计Go语言的初衷是满足 Google 的需求。设计此语言花费了两年的时间,融入了整个团队多年的经验及对编程语言设计的深入认识。设计团队借鉴了 Pascal、Oberon 和C语言的设计智慧,同时让Go语言具备动态语言的便利性。因此,Go语言体现了经验丰富的计算机科学家的语言设计理念,是为全球最大的互联网公司之一设计的。

为什么要创造Go语言呢?

  • 企业运行维护很多C/C++的项目,C/C++程序运行速度虽然很快,但是编译速度却很慢,同时还存在内存泄露的一系列困扰需要解决。

    Go语言的所有设计者都说,设计Go语言是因为 C++ 给他们带来了挫败感。在 Google I/O 2012 的 Go 设计小组见面会上,Rob Pike 是这样说的:

    我们做了大量的 C++ 开发,厌烦了等待编译完成,尽管这是玩笑,但在很大程度上来说也是事实。

  • 硬件限制:摩尔定律已然失效

    摩尔定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。

    摩尔定律

    从上面的图表可以看出,近十年单线程性能和处理器频率保持稳定。我们不能像之前一样把添加更多晶体管当成是解决方案,因为在较小规模上一些量子特性开始出现(如隧道效应),并且因为在同样小的空间里放置更多晶体管的代价非常昂贵,每1美元可以添加的晶体管数量开始下降。

    制造商开始从其他方面提高处理器的性能:

    1. 向处理器添加越来越多的内核,如四核和八核CPU。
    2. 发明了超线程技术。
    3. 为处理器添加了更多缓存以提高性能。

    但上述解决方案也有其自身的局限性。因为成本原因我们不能无限制的为计算机添加内核,也无法无限制的添加缓存来提高性能,因为缓存越大,取值的性能越低。

    我们没有办法在硬件上一直取得突破,我们需要提高软件的性能或者说我们需要高性能的软件。

Go语言特点

Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率,使用一个表达式来形容Go语言,则如下:

Go = C + Python

  • Go语言有时候被描述为“C 类似语言”,或者是“21 世纪的C语言”。Go 从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。

    下面先普及几个Go语言的程序,让大家感受下Go语言的魅力。首先介绍指针,go语言函数中是将变量写在前面,类型写在后面,同时Go语言后不用带分号(;)。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    package main
    
    //go语言指针的使用特点 星号取值
    func testPtr(num *int) {
    	*num = 20
    }
    
    func main() {
    
    }
    
  • 引入包的概念,用于组织程序结构,Go语言的 一个文件都要归属于一个包,而不能单独存在。比如新建“test.go”文件,需要在一个包main中。

    1
    2
    3
    4
    5
    6
    
    package main    //一个go文件需要在一个包中
    
    import "fmt"
    func sayOK() {
    	fmt.Println("ok")
    }
    
  • 垃圾回收机制

    内存自动回收,不需要开发人员管理,防止造成内存泄露。

  • 天然并发性能

    从语言层面支持并发,实现简单;goroutine轻量级线程,可实现大并发处理,高效利用多核;基于CPS并发模型(Communicating Sequential Process)实现。

  • 吸收了管道通信机制

    形成Go语言特有的管道channel。通过管道channel可以实现不同的goroute之间的相互通信。

Go在语法上与C相近,但功能上有: 内存安全, GC(垃圾回收), 结构形态以及CSP-Style并发计算,它是编程语言的又一次尝试,是对类C语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。

因为Go语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说Go语言是一门混合型的语言。

此外,很多重要的开源项目都是使用Go语言开发的,其中包括 Docker、Go-Ethereum、Thrraform 和 Kubernetes。

该语言的吉祥物为Gopher,如下图所示:

Gopher

Go性能强悍

与其他现代高级语言(如Java/Python)相比,使用C,C++的最大好处是它们的性能。因为C/ C++是编译型语言而不是解释的语言。 处理器只能理解二进制文件,Java和Python这种高级语言在运行的时候需要先将人类可读的代码翻译成字节码,然后由专门的解释器再转变成处理器可以理解的二进制文件。

同C,C++一样,Go语言也是编译型的语言,它直接将人类可读的代码编译成了处理器可以直接运行的二进制文件,执行效率更高,性能更好。

数据来源

可以看出,Go 语言在性能上更接近于 Java 语言,虽然在某些测试用例上不如经过多年优化的 Java 语言,但毕竟 Java 语言已经经历了多年的积累和优化。Go 语言在未来的版本中会通过不断的版本优化提高单核运行性能。

Go简单易学

语法简洁

Go 语言简单易学,学习曲线平缓,不需要像 C/C++ 语言动辄需要两到三年的学习期。Go 语言被称为“互联网时代的C语言”。Go 语言的风格类似于C语言。其语法在C语言的基础上进行了大幅的简化,去掉了不需要的表达式括号,循环也只有 for 一种表示方法,就可以实现数值、键值等各种遍历。

代码风格统一

Go 语言提供了一套格式化工具——go fmt。一些 Go 语言的开发环境或者编辑器在保存时,都会使用格式化工具进行修改代码的格式化,这样就保证了不同开发者提交的代码都是统一的格式。(吐槽下:再也不用担心那些看不懂的黑魔法了…)

开发效率高

Go语言实现了开发效率与执行效率的完美结合,让你像写Python代码(效率)一样编写C代码(性能)。

Go语言前景

Go语言虽然是一门非常年轻的语言(2009年正式开源),但却以不可思议的速度在成长着。

顶级大公司(谷歌)的支持、顶尖的设计者(Rob Pike、Ken Thompson)和豪华的开发团队、“杀手级”的项目(k8s)、开放活跃的社区以及数以百万计的开发者都揭示了Go语言的巨大潜力。在国内,Go语言良好的发展趋势可以从招聘网站中数量庞大的岗位需求以及每天发表在各种媒体上的种类繁多的相关文章中得到印证。

目前Go语言以及广泛应用于人工智能、云计算开发、容器虚拟化、⼤数据开发、数据分析及科学计算、运维开发、爬虫开发、游戏开发等领域。

Go语言简单易学,天生支持并发,完美契合当下高并发的互联网生态。Go语言的岗位需求持续高涨,目前的Go程序员数量少,待遇好,竞争压力比Java小得多

抓住趋势,要学会做一个领跑者而不是跟随者。

国内Go语言的需求潜力巨大,目前无论是国内大厂还是新兴互联网公司基本上都会有Go语言的岗位需求。

下图是应用Go语言的公司举例:

应用Go语言的公司

  • Google

    作为创造了Go语言的 google 公司,当然会力挺Go语言了。Google 有很多基于 Go 开发的开源项目,比如 kubernets,docker

  • Facebook

    Facebook 也在使用Go语言,为此他们还专门在 Github 上建立了一个开源组织 facebookgo。大家可以通过 https://github.com/facebookgo 访问查看 facebook 开源的项目,其中最具代表性的就是著名平滑重启工具 grace。

  • 腾讯

    腾讯在 15 年就已经做了 Docker 万台规模的实践。因为腾讯主要的开发语言是 C/C++ ,所以在使用Go语言方面会方便很多,也有很多优势,不过日积月累的 C/C++ 代码很难改造,也不敢动,所以主要在新业务上尝试使用 Go。

  • 百度

    百度主要在运维方面使用到了Go语言,比如百度运维的一个 BFE 项目,主要负责前端流量的接入,其次就是百度消息通讯系统的服务器端也使用到了Go语言。

  • 七牛云

    七牛云算是国内第一家选Go语言做服务端的公司。早在 2011 年,当Go语言的语法还没完全稳定下来的情况下,七牛云就已经选择将 Go 作为存储服务端的主体语言。

  • 京东

    京东云消息推送系统、云存储,以及京东商城的列表页等都是使用Go语言开发的。

  • 小米

    小米对Go语言的支持,在于运维监控系统的开源,它的官方网址是 http://open-falcon.org/。此外,小米互娱、小米商城、小米视频、小米生态链等团队都在使用Go语言。

  • 360

    360 对Go语言的使用也不少,比如开源的日志搜索系统 Poseidon,大家可以通过 https://github.com/Qihoo360/poseidon 查看,还有 360 的推送团队也在使用Go语言。

除了上面列出的大厂外,很多小型公司或创业公司也开始使用Go语言,并且很多公司把Go语言作为其主要开发语言。

学习Go语言的前景这么好,心动了吗?

那么就马上开启你的Golang学习之旅吧!

参考链接:

李文周

渝ICP备2022001449号
本站总访问量