😄 Go-02-Go语言介绍
😄 Go-02-Go语言介绍
1 开篇介绍
👋 Hello,大家好,我是 Nagase , Life is short, Let's Go! 人生苦短,即刻出发!又到了学习 Go 的时刻,接下来就让我们感受一下 Go 独特的魅力吧。
基于上一节内容所学,我们了解了计算机相关的一些概念,那么接下来我们的学习任务是:Go语言介绍 ,祝你学的开心 🥳
2 Go 语言的作者
Go 语言的主要开发者有:肯·汤姆森(Ken Thompson)、罗布·派克(Rob Pike)、罗伯特·格里茨默(Robert Griesemer)。
- Ken Thompson,贝尔实验室 Unix 团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开发了 UTF-8 字符集规范。
- Rob Pike:Go 语言项目总负责人,贝尔实验室 Unix 团队成员,参与的项目包括 Plan 9,Inferno 操作系统和 Limbo 编程语言
- Robert Griesemer:参与开发 Java HotSpot 虚拟机
他们被称为是计算机领域「发明之父」所组成的黄金团队,他们对系统编程语言,操作系统和并行都有着非常深刻的见解。
3 Go 语言的起源
随着软件规模的不断扩大,诸多的学者和谷歌的开发者们在公司内部的软件开发过程中开始经历大量的挫折,在诸多问题上都不能给出令人满意的解决方案,尤其是在使用 C++ 来开发大型的服务端软件时,情况更是不容乐观。
由于二进制文件一般都非常大,因此就需要耗费大量的时间在编译文件上,同时编程语言的设计思想也已经非常陈旧,这些情况都充分表明了现有的编程语言已不符合时下的生产环境。
尽管硬件在过去的几十年中有了飞速的发展,但人们依旧没有找到机会去改变 C++ 在软件开发的重要地位,并在实际开发过程中还得忍受着它所带来的一些令人头疼的问题。因此学者们坐下来总结出了现在 生产环境与软件开发 之间的 主要矛盾 ,并尝试设计一门全新的编程语言来解决这些问题。
以下就是他们讨论得出的对编程语言的设计要求:
- 能够以更快的速度开发软件
- 开发出的软件能够很好地在现代的多核计算机上工作
- 开发出的软件能够很好地在网络环境下工作
- 使人们能够享受软件开发的过程
Go 语言就在这样的环境下诞生了,它让人感觉类似 Python 这样的动态语言,但同时却又拥有了像 C 这类语言的高性能。一开始 Go 语言的出现是为了解决 Google 公司内开发软件基础设施时遇到的一些问题。
在大的角度上来看,Go 语言出现的目的是在编程领域中创造出最实用的方式来进行软件开发。它并不是要用奇怪的语法或晦涩难懂的概念来从根本上推翻已有的编程语言,而是重建并改善了 C、Java 中的许多语法风格。它提倡通过 接口 来针对 面向对象编程 ,通过 goroutine 和 channel 来支持 并发 和 并行 编程。
现在的服务器程序源代码已经达到了惊人的数以百万行,而且每天还需要进行更新,这也就算了,更加困难的是,即使在大型编译集群上进行一次 Build ,所消耗的时间也长达数十分钟甚至数小时。
Go 语言起源于 2007 年,并于 2009 年正式对外发布。它从 2009 年 9 月 21 日开始作为 Google 公司 20% 兼职项目,即相关员工利用 20% 的空余时间来参与 Go 语言的研发工作。
2009 年 11 月 10 日,开发团队将 Go 语言项目以 BSD-style 授权(完全开源)正式公布了 Linux 和 macOS 平台上的版本。同年 11 月 22 日公布了 Windows 版本。
基于 BSD 可用协议意味着这是一门完全免费开源的编程语言,所以任何人都可以进行商业软件的开发而不需要支付任何费用。
Go 语言的源代码托管在 GitHub 上。
Go 通过以下的 Logo 来展示它的速度,并以囊地鼠 (Gopher) 作为它的吉祥物。
4 Go 语言发展史
📅 日期版本 | 简介 |
---|---|
2009 年 11 月 7 日 weekly.2009-11-06 | 早期的版本 |
2012 年 3 月 28 日 go1 | 稳定版本的发布 |
2013 年 5 月 14 日 go1.1 | 语言本身的变化、库的变化等 |
2013 年 12 月 01日 go1.2 | 提供更好的调度和一个新的语言特性 |
2014 年 6 月 18 日 go1.3 | 主要是在实现的工作上的变化,以及精准的垃圾回收 |
2014 年 12 月 10 日 go1.4 | 包含了2个很小的语言变更 |
2015 年 8 月 19 日 go1.5 | 实现的架构变化,同时保留了和旧版本的兼容性,本次更新中移除 了“最后残余的 C 代码” ,实现了 自举 |
2016 年 8 月 15 日 go1.7 | 标准库有显著的性能改进和变化 |
2017 年 2 月 26 日 go1.8 | 标准库有显著的性能改进和变化 |
2017 年 8 月 24 日 go1.9 | 包含语言、标准库、运行时的诸多变化,大部分是对运行时和工具的改进 |
2018 年 2 月 16 日 go1.10 | 大部分更改都在工具链,运行时和库的实现中 |
2018 年 8 月 24 日 go1.11 | modules 和 WebAssembly 支持 |
2019 年 2 月 go1.12 | modules 和 WebAssembly 支持 |
2019 年 2 月 go1.12 | 基于 analysi 包重写了 go vet 命令,为开发者写自己的检查器提供了更大的灵活性 |
2019 年 9 月 go1.13 | 改进了 sync 包中的 Pool ,在 gc 运行时不会清除 pool。它引进了一个缓存来清理两次 gc 运行时都没有被引用的 pool 中的实例。重写了逃逸分析,减少了 Go 程序中堆上的内存申请的空间 |
2020 年 2 月 go1.14 | 现在 Go Module 已经可以用于生产环境,鼓励所有用户迁移到 Module。该版本支持嵌入具有重叠方法集的接口。性能方面做了较大的改进,包括:进一步提升 defer 性能、页分配器更高效,同时 timer 也更高效。现在,Goroutine 支持异步抢占 |
2020 年 8 月 12 日 go1.15 | 不再支持 macOS Sierra 之前的版本 |
5 Go 语言的应用场景
Go 语言与 C 语言类似,属于系统编程语言, Go 语言被设计成一门应用于集群 Web 服务器或类似用途的巨型中央服务器的系统编程语言,对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率,它提供了海量并行的支持,这对于游戏服务端的开发而言是再好也不过了。
Go 语言的一个非常好的目标就是实现所谓的复杂事件处理(CEP),这项技术要求海量并行支持,高度的抽象化和高性能,当我们进入到物联网时代,CEP 必然会成为人们关注的焦点。
在 Google 内部,如谷歌地图、Google Cloud、 youtube.com、dl.google.com 都已经开始使用 Go 语言开发,除此之外还有一些其它小应用(有的是在 GAE 上)也选择使用 Go。另外内部有专门的团队在将老应用重写或引导新项目使用 Go 语言。而在 Google 之外,BBC Worldwide、Canonical、Heroku、Nokia、SoundCloud 也都在尝试 Go。
关键字:服务开发、并发、分布式、微服务等方向
6 Go 语言的特性
Go 语言从本质上(程序和结构方面)来实现并发编程。
因为 Go 语言没有 类 和 继承 的概念,所以它和 Java 或 C++ 看起来并不相同。但是它 通过接口(interface) 的概念来 实现多态性 。Go 语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说这是一门混合型的语言。
在传统的面向对象语言中,使用面向对象编程技术显得非常臃肿,它们总是通过复杂的模式来构建庞大的类型层级,这违背了编程语言应该提升生产力的宗旨。
函数是 Go 语言中的基本构件,它们的使用方法非常灵活。
Go 语言使用静态类型,所以它是类型安全的一门语言,加上通过构建到本地代码,程序的执行速度也非常快。
作为强类型语言,隐式的类型转换是不被允许的,记住一条原则:让所有的东西都是显式的。
Go 语言其实也有一些动态语言的特性(通过关键字 var),所以它对那些逃离 Java 和 .Net 世界而使用 Python、Ruby、PHP 和 JavaScript 的开发者们也具有很大的吸引力。
Go 语言支持 交叉编译,比如说你可以在运行 Linux 系统的计算机上开发运行在 Windows 下运行的应用程序。这是第一门完全支持 UTF-8 的编程语言,这不仅体现在它可以处理使用 UTF-8 编码的字符串,就连它的源码文件格式都是使用的 UTF-8 编码。Go 语言做到了真正的国际化!
7 Go 语言缺失的特性
许多能够在大多数面向对象语言中使用的特性 Go 语言都没有支持,但其中的一部分可能会在未来被支持。
- 为了简化设计,不支持函数重载和操作符重载
- 为了避免在 C/C++ 开发中的一些 Bug 和混乱,不支持隐式转换
- Go 语言通过另一种途径实现面向对象设计来放弃类和类型的继承
- 尽管在接口的使用方面可以实现类似变体类型的功能,但本身不支持变体类型
- 不支持动态加载代码
- 不支持动态链接库
- 不支持泛型
- 通过
recover
和panic
来替代异常机制 - 不支持断言
- 不支持静态变量
8 Go 语言的哲学
Go 语言使用了与其它编程语言不同的设计模式,所以当你尝试将你之前的编程语言的代码迁移到 Go 语言时,你将会非常失望,所以你需要从头开始,用 Go 的理念来思考。
如果你在至高点使用 Go 的理念来重新审视和分析一个问题,你通常会找到一个适用于 Go 语言的优雅的解决方案。
Go 语言有一个被称之为 “没有废物” 的宗旨,就是将一切没有必要的东西都去掉,不能去掉的就无底线地简化,同时追求最大程度的自动化。它完美地诠释了敏捷编程的 KISS 秘诀:短小精悍!
与 C++ 或 Java 这些有着庞大体系的语言相比,Go 语言简洁到可以将它整个的装入你的大脑中,真可谓是 21 世纪的 C 语言 !
9 影响 Go 语言发展的早期编程语言
正如 “21 世纪的 C 语言” 这句话所说,Go 语言并不是凭空捏造的,而是和 C++、Java 和 C# 一样同属 C 系。不仅如此,设计者们还汲取了其它编程语言的精粹部分融入到 Go 语言当中。
尽管为了能够让目前主流的开发者们能够对 Go 语言中的 类C 语言的语法感到非常亲切而易于转型,但是它在极大程度上简化了这些语法,使得它们比 C/C++ 的语法更加简洁和干净。同时,Go 语言也拥有一些动态语言的特性,这使得使用 Python 和 Ruby 的开发者们在使用 Go 语言的时候感觉非常容易上手。
下图展示了一些其它编程语言对 Go 语言的影响:
10 为什么要创造 Go 语言
- C/C++ 的发展速度无法跟上计算机发展的脚步,十多年来也没有出现一门与时代相符的主流系统编程语言,因此人们需要一门新的系统编程语言来弥补这个空缺,尤其是在计算机信息时代。
- 对比计算机性能的提升,软件开发领域不被认为发展地足够快或者比硬件发展更加成功(有许多项目均以失败告终),同时应用程序的体积始终在不断地扩大,这就迫切地需要一门具备更高层次概念的低级语言来突破现状。
- 在 Go 语言出现之前,开发者们总是面临非常艰难的抉择,究竟是使用执行速度快但是编译速度并不理想的语言(如:C++),还是使用编译速度较快但执行效率不佳的语言(如:.NET、Java),或者说开发难度较低但执行速度一般的动态语言呢?显然,Go 语言在这 3 个条件之间做到了最佳的平衡:快速编译,高效执行,易于开发。
11 Go 语言的发展目标
Go 语言的主要目标是将 静态语言的安全性和高效性 与 动态语言的易开发性 进行有机结合,达到完美平衡,从而使编程变得更加有乐趣,而不是在艰难抉择中痛苦前行。
因此,Go 语言是一门类型安全和内存安全的编程语言。虽然 Go 语言中仍有指针的存在,但并不允许进行指针运算。
12 使用 Go 语言的知名公司
公司名称 | 应用场景 |
---|---|
七牛云 | 提供 CDN 服务 |
京东 | 京东云消息推送系统、云存储,以及京东商城等都有使用Go做开发。 |
百度 | 目前所知的百度的使用是在运维这边,是百度运维的一个BFE项目,负责前端流量的接入,其次就是百度的消息系统。 |
阿里 | 系统部门、CDN |
美团 | 美团后台流量支撑程序 |
bilibili | bilibili 后台主程序 |
Google 基于 Go 有很多优秀的项目,比如:Kubernetes,Github 上查看更多 Google 的 Go 开源项目 | |
Facebook 也在用,为此他们还专门在 Github 上建立了一个开源组织facebookgo,可以查看 Facebook 开源的项目,比如著名的是平滑升级的 grace | |
腾讯 | 腾讯作为国内的大公司,还是敢于尝试的,尤其是 Docker 容器化这一块,他们在15年已经做了 docker 万台规模的实践,具体可以参考 |
小米 | 小米对 Golang 的支持,莫过于运维监控系统的开源。 |
13 使用 Go 语言开发的项目
项目名称 | 简介 |
---|---|
docker | 基于 lxc 的一个虚拟打包工具,能够实现PAAS平台的组建。 |
Kubernetes | Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡 |
区块链 | BTCD 是用 go 语言实现的完整节点的比特币实现 |
nsq | bitly 开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息 |
packer | 用来生成不同平台的镜像文件,例如 VM、vbox、AWS 等,作者是 vagrant 的作者 |
skynet | 分布式调度框架 |
Doozer | 分布式同步工具,类似 ZooKeeper |
Heka | mazila 开源的日志处理系统 |
cbfs | couchbase 开源的分布式文件系统 |
tsuru | 开源的 PAAS 平台,和 SAE 实现的功能一模一样 |
groupcache | memcahe 作者写的用于 Google 下载系统的缓存系统 |
god | 类似 redis 的缓存系统,但是支持分布式和扩展性 |
gor | 网络流量抓包和重放工具 |