本文是「vangoleo的Go语言学习笔记」系列文章之一。
官网: http://www.vangoleo.com/go/hello-golang/

我在2015年第一次接触Go语言,完成了Hello World,随后也一直在关注这门新语言。至今,Go语言发展已经过去十年多了,越来越受到广大开发者的关注,而且随着云原生、IoT、区块链的流行,Go似乎要成为21世纪的第一语言。Docker、Kubernetes、以太坊等重量级的项目都是基于Go开发。

Go语言是Google公司在2009年开源的一门高级编程语言,它为解决大型系统开发过程中的实际问题而设计,支持并发、规范统一、简单优雅,性能强大,被很多Go语言传道者誉为“云计算时代的C语言”。

近期,我在系统地学习Go语言,并整理了一些学习笔记。后续会和大家进行分享。今天先和大家聊聊Go语言的发展史和Go语言的特点。

Go的命名


这是一封由Rob Pike在2007年9月25日,下午3:12发送给Robert Griesemer和Ken Thompson的有关编程语言讨论主题的邮件,邮件正文大意为:

我在开车回家的路上得到了些灵感:

  • 给这门编程语言取名为“go”,它很简短,易书写。
  • 工具类可以命名为:goc、 gol、goa。
  • 交互式的调试工具也可以直接命名为“go”。
  • 语言文件后缀名为 .go 等等。

和很多伟大的公司诞生于车库一样,Go语言的命名也和汽车有关。以上就是Go语言名字的来源。我个人是很喜欢Go这个命名的,看似很随意的一个想法,却很精准。有着Google的纯正血统,又体现了语言简单,优雅的特点。而且Go里面开启一个协程的关键字就是go。

谷歌工程师的20%时间

自此之后Robert、Rob和Ken三个人开始在Google内部进行了研发,一直到了2009年,Go正式开源了,Go项目团队将2009年11月10 日,即该语言正式对外开源的日字作为其官方生日。源代码最初托管在http://code.google.com上,之后几年才逐步的迁移到 GitHub上。
谷歌的“20%时间”工作方式,允许工程师拿出20%的时间来研究自己喜欢的项目。语音服务Google Now、谷歌新闻Google News、谷歌地图Google Map上的交通信息等,全都是20%时间的产物。
Go语言最开始也是20%时间的产物。

Go语言的三位创始人

邮件中提到的就是Go语言最重要的3位创始人:

让我们来认识一下这3位大佬:

  • Rob Pike:曾是贝尔实验室Unix开发团队成员,Plan9操作系统开发的主要领导人,Inferno操作系统开发的主要领导人。
  • ken tomption:图灵奖得主,C语言前身B语言的作者,Unix的发明人之一,操作系统Plan 9的主要作者。 共同开发了UTF-8。
  • Robert:曾为谷歌的V8 JavaScript引擎和Chubby开发代码。

Go语言血统

编程语言的发展,和物种进化类似。每种编程语言都会从先前的语言吸取精华,再进行创新和改进。下图展示了Go从它的前辈们继承了哪些优点,Go正是站在这些巨人的肩膀上,在云时代,发挥越来越大的作用。

Go语言从前辈们继承的特点:

  • C语言:Go语言有时候被描述为“C类似语言”,或者是“21世纪的C语言”。Go从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配
  • Pascal:但是在Go语言的家族树中还有其它的祖先。其中一个有影响力的分支来自Niklaus Wirth所设计的 Pascal)语言。然后Modula-2语言激发了包的概念。然后Oberon)语言摒弃了模块接口文件和模块实现文件之间的区别。第二代的Oberon-2)语言直接影响了包的导入和声明的语法,还有Oberon)语言的面向对象特性所提供的方法的声明语法等。
  • CSP:Go语言的另一支祖先,带来了Go语言区别其他语言的重要特性,灵感来自于贝尔实验室的Tony Hoare于1978年发表的鲜为外界所知的关于并发研究的基础文献,顺序通信进程(communicating sequential processes ,缩写为CSP)。在CSP中,程序是一组中间没有共享状态的平行运行的处理过程,它们之间使用管道进行通信和控制同步。不过Tony Hoare的CSP只是一个用于描述并发性基本概念的描述语言,并不是一个可以编写可执行程序的通用编程语言。Go语言使用管道在协程进进行通信

重量级应用

如下是列举的一些Go语言的重量级应用:

Go的优点

如果现实世界需要我能够在几天内对一个生产系统进行原型设计、测试和部署,而且在每秒能处理比原来多5倍请求,CPU和内存的开销还都很小。我想大概只有Go语言可以胜任了。

Go语言有如下优点:

  • 单独的二进制发布:Go项目编译会生成一个静态的可执行文件。该文件可独立运行而不需要其他依赖。这种方式特别适合于云原生容器环境。
  • 交叉编译:在任何操作系统上都可以编译在其他平台上可运行的二进制文件。比如在Mac系统上可编译出在Linux和Windows上可运行的二进制文件。
  • 垃圾回收:Go语言支持垃圾回收。相比较,C++,Rust等需要开发者自己控制。
  • 执行性能:Go非常的快。性能接近于C++。远高于Java,Python、Node。
  • 开发效率:Go语言同时具备静态语言的运行性能和动态语言的开发效率。
  • 简单,高效:Go语言的设计哲学里就包括了简单和高效。一个典型的反例就是复杂,臃肿的Java语言。
  • 并发性:语言层面支持并发,通过协程和通道简化并发开发,提高并发性能。
  • 丰富的标准库:Go标准库覆盖了文本,IO,网络,加密,Web服务,远程RPC,模板引擎等功能。
  • 可以调用C语言:可以调用C语言函数,进一步优化性能,复用C语言庞大的生态系统。
  • 快速编译时间:Go的编译特别快。大家可以参考两款静态博客生成系统,Hexo(Node开发)和Hugo(Go开发)。
  • 工程型:Go语言设计的目的就是成为一门工程语言,解决实际的工程问题。Go语言定义了开发规范,并提供了丰富的工具。使用Go语言可以编写出容易阅读和理解,容易测试、维护和扩展的程序。

Go缺点

  • 缺少重量级框架。如Ruby的Rails,Python的Django,Java的Spring。
  • 错误处理:没有异常系统。Go官方正在解决该问题。
  • 软件包管理:很长时间以来,Go官方都没有一套软件包管理体制。直到最近,Go的1.13版本正式引入了Go Module作为官方的依赖管理工具。
  • 不是标准的面向对象的编程模型:这个也是Go语言的一个创新。如果你是坚实的OOP的拥护者,可能会有些不适应。

文化

人们说,每当你学习一门新的口语时,你也会沉浸在说这种语言的人的某些文化中。因此,您学习的语言越多,您可能会有更多的变化。
编程语言也是如此。无论您将来如何应用新的编程语言,它总能给你带来新的编程视角或某些特别的技术。
无论是函数式编程,模式匹配还是原型继承,一旦你学会了它们,你就可以随身携带这些编程思想,这扩展了你作为软件开发人员所拥有的问题解决工具集。它们也改变了你阅读高质量代码的方式。
而Go在这方面有一项了不起的财富。Go文化的主要支柱是保持简单,脚踏实地的代码,而不会产生许多冗余的抽象概念,并将可维护性放在首位。大部分时间花费在代码的编写工作上,而不是在修补工具和环境或者选择不同的实现方式上,这也是Go文化的一部分。
Go文化也可以总结为:“应当只用一种方法去做一件事,并保持简单,高效”

一点注意事项。当你需要构建相对复杂的抽象代码时,Go通常会妨碍你。好吧,我会说这是简单的权衡。

本文由 www.vangoleo.com 发布

你好,Go语言的更多相关文章

  1. 数据攻略●R语言自述

    (注明:以下文章均在Linux操作系统下执行) 一.R语言简介 R语言是用于统计分析,图形表示和报告的编程语言和软件环境.R语言由Ross Ihaka和Robert Gentleman在新西兰奥克兰大 ...

  2. Android多语言与国际化

    internationalization (国际化)简称 i18n,因为在i和n之间还有18个字符,localization(本地化 ),简称L10n.一般用 语言_地区的形式表示一种语言,如 zh_ ...

  3. C语言经典88案例,我文科妹妹说她都学会了!

    案例ex01: 将字符串转换为一个整数 1 题目 函数:fun() 功能:将字符串转换为一个整数 描述: [不能使用C语言提供的字符串函数] 输入:字符串"-1234" 输出:整型 ...

  4. IO 流

    ------------恢复内容开始------------ 一.流的简介 输入流:把硬盘中的数据读取到内存中 输出流:把内存中的数据读取到硬盘中 1字符=2字节 1字节=8位 1.2顶级父类  二. ...

  5. 趣文分享:C 语言和 C++、C# 的区别在什么地方?

    任务: 把大象放到冰箱里.

  6. 再见,Python!你好,Go语言

    Go 语言诞生于谷歌,由计算机领域的三位宗师级大牛 Rob Pike.Ken Thompson 和 Robert Griesemer 写成.由于出身名门,Go 在诞生之初就吸引了大批开发者的关注.诞生 ...

  7. 你好,C语言

    对于我来说,C语言就和陌生人一样,对他完全不了解,更不要提什么C++了,这就要我主动和他打招呼,深入认识了解它了哈.目前对于C语言的理解,只知道他的的功强大,能操作硬件,编写各类驱动,强悍的LINUX ...

  8. 《快乐编程大本营》java语言训练班 1课:第一个java程序:你好,范冰冰;

    1Java介绍 2安装java环境JDK 3安装web环境tomcat 4安装开发工具Idea2017 5编写第一个程序 ‘你好,范冰冰!’ 地址: http://code6g.com 1.Java介 ...

  9. 计算机专业学了快一年, 只会一点C语言,你好意思说自己是IT专业的?

    目录 一.C/C++入门阶段 学习视频推荐:C++入门基础[B站 小甲鱼] 二.C/C++开发进阶 学习视频推荐:C++进阶[慕课网 免费课] 三.C++开发高级 视频教程:程序设计[中国大学MOOC ...

随机推荐

  1. SPSS学习笔记参数检验—两配对样本t检验

    目的:检验两个有联系的正态总体的均值是否存在显著差异. 适用条件:有联系,正态总体,样本量要一样.一般可以分为一下四种: ①同一受试对象处理前后的对比:如对于糖尿病人,对同一组病人在使用新治疗方法前测 ...

  2. Python学习笔记整理总结【Django】:Model操作(一)

    Model操作(一) 一.Django ORM基本配置 ORM:关系对象映射(Object Relational Mapping,简称ORM)db Frist:到目前为止,当我们的程序涉及到数据库相关 ...

  3. Redis-->windows上的安装教程

    Windows下安装Redis服务 说明:本文拷贝自http://www.cnblogs.com/jaign/articles/7920588.html Redis是有名的NoSql数据库,一般Lin ...

  4. Docker系列(二):通过Docker安装使用 Kubernetes (K8s)

    Docker社区版从17.12版本开始已经提供了对Kubernetes的支持.但是由于其安装过程依赖的镜像服务在国内访问很不稳定,很多朋友都无法配置成功.我们提供了一个简单的工具帮助大家开启Docke ...

  5. php数字函数

    is_numeric() 检查变量是否包含一个合法数字 round()  取整数,四舍五入 round(数字, 小数位) ceil()  向上取整 floor() 向下取整 range()  生成范围 ...

  6. Ubuntu部署Tomcat Web服务

    在Ubuntu平台中安装TomCat 本文将为大家介绍TomCat在Ubuntu平台中如何进行部署使用,带你快速入门使用TomCat TomCat简介 Tomcat是Apache 软件基金会(Apac ...

  7. 常用css总结

    个人博客: https://chenjiahao.xyz 1.让网站快速变灰 html { filter: grayscale(100%);//IE浏览器 -webkit-filter: graysc ...

  8. [经验分享]C# 操作Windows系统计划任务

    背景:我做了一个事情是要自己提前创建好很多要定时执行的任务,在我不在的时候自动执行这些程序,以保证我的工作能无人值守,那么我就需要建立系统计划任务来帮我完成这件事情,当然用脑子想想如何实现,很简单,每 ...

  9. MySQLdb操作数据库

    堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: + ...

  10. 【TencentOS tiny】深度源码分析(2)——调度器

    温馨提示:本文不描述与浮点相关的寄存器的内容,如需了解自行查阅(毕竟我自己也不懂) 调度器的基本概念 TencentOS tiny中提供的任务调度器是基于优先级的全抢占式调度,在系统运行过程中,当有比 ...