# Go语言发展历史
```{eval-rst}
.. include:: ../../sumaccess.rst
```

## Go语言核心开发团队
:::{tabbed} Ken Thompson
1983年图灵奖 TuringAward 和1998年美国国家技术奖 National Medal of Technology 得主。他与Dennis Ritchie是Unix的原创者。Thompson也发明了后来衍生出 `C` 语言的 `B` 程序语言,同时也是 `C` 语言的主要发明人。
:::
:::{tabbed} Rob Pike
Go语言项目的总负责人,曾是贝尔实验室 Bell Labs 的Unix团队,和 `Plan 9` 操作系统计划的成员。 他与 Thompson 共事多年,并共创出广泛使用的 `UTF-8` 字元编码,此人兴趣广泛,包括但不限于射箭、天文学等
:::
:::{tabbed} Robert Griesemer
曾协助制作Java的 HotSpot 编译器,和 Chrome 浏览器的 JavaScript 引擎 `V8` 。
:::
## Google为什么要创建Go
```{ADMONITION} 历史场景
谷歌有两个巨大的问题。 **其中之一是编译时间:**
早在 `1980` 年,常规项目就需要数个小时才能完成完整的构建,对此,也有专门用于重新编译的整个服务器机房。由于这种耗费时间的编译构建都在晚上进行,这也是 ``nightly build`` 这个新名词的由来。
当然,这个"优良传统"也从上世纪八十年代保持到了 `2017` 年,即使用高性能的 ``i7`` 服务器从头开始编译构建 ``chrome`` 也需要 **5** 个小时。程序的编译构建造成了巨大的时间浪费,以至于谷歌发明了区分依赖分析和编译过程的工具,只是为了让传统的编译构建提升几个百分点。
Google 的另一个问题是 **字符串处理:**
Google 会读取和分析大量网页,这些网页都是文本文件。他们进行了大量的字符串操作,因此这方面的功能也是非常有必要的。谷歌在 Go 中构建了一个丰富的字符串函数库,Go语言的垃圾收集机制也使得字符串处理起来更加高效,并且在某些其他字符串库所没有的方面更加高效 ``暗指C++ 委员会`` 。
每个公司都认为自己是编程语言设计师。微软和苹果有自己的语言(苹果现在有两种)。谷歌当然也不能缺席。Facebook 也推出了自己的语言 ,只剩下可怜的亚马逊。
作为一种语言设计,Go 也有其存在的道理。它在任何方面都不是创新的,但肯定是为非常特定的用途而精心设计的。
```
因此谷歌的工程师 Robert Griesemer 、 Rob Pike 和 KenThompson 为一门新语言勾画出了一些目标:
- [x] 快速编译
- [x] 不太笨重的代码
- [x] 自动释放未使用的内存(垃圾收集)
- [x] 易于编写同事执行多个操作的软件(并发)
- [x] 很好的支持多核处理器
经过几年的工作,谷歌创建了Go: 一种能快速编写代码并生成程序的语言,可以 **快速编译** 和运行。该项目在 `2009` 年转向了开源许可。现在任何人都可以免费使用。Go以其简单和强大的功能而迅速流行起来。
## Go语言发展历史
- [go1.17 (released 2021-08-16)](https://go.dev/doc/devel/release#go1.17)[Minor revisions](https://go.dev/doc/devel/release#go1.17.minor)
- [go1.16 (released 2021-02-16)](https://go.dev/doc/devel/release#go1.16)[Minor revisions](https://go.dev/doc/devel/release#go1.16.minor)
- [go1.15 (released 2020-08-11)](https://go.dev/doc/devel/release#go1.15)[Minor revisions](https://go.dev/doc/devel/release#go1.15.minor)
- [go1.14 (released 2020-02-25)](https://go.dev/doc/devel/release#go1.14)[Minor revisions](https://go.dev/doc/devel/release#go1.14.minor)
- [go1.13 (released 2019-09-03)](https://go.dev/doc/devel/release#go1.13)[Minor revisions](https://go.dev/doc/devel/release#go1.13.minor)
- [go1.12 (released 2019-02-25)](https://go.dev/doc/devel/release#go1.12)[Minor revisions](https://go.dev/doc/devel/release#go1.12.minor)
- [go1.11 (released 2018-08-24)](https://go.dev/doc/devel/release#go1.11)[Minor revisions](https://go.dev/doc/devel/release#go1.11.minor)
- [go1.10 (released 2018-02-16)](https://go.dev/doc/devel/release#go1.10)[Minor revisions](https://go.dev/doc/devel/release#go1.10.minor)
- [go1.9 (released 2017-08-24)](https://go.dev/doc/devel/release#go1.9)[Minor revisions](https://go.dev/doc/devel/release#go1.9.minor)
- [go1.8 (released 2017-02-16)](https://go.dev/doc/devel/release#go1.8)[Minor revisions](https://go.dev/doc/devel/release#go1.8.minor)
- [go1.7 (released 2016-08-15)](https://go.dev/doc/devel/release#go1.7)[Minor revisions](https://go.dev/doc/devel/release#go1.7.minor)
- [go1.6 (released 2016-02-17)](https://go.dev/doc/devel/release#go1.6)[Minor revisions](https://go.dev/doc/devel/release#go1.6.minor)
- [go1.5 (released 2015-08-19)](https://go.dev/doc/devel/release#go1.5)[Minor revisions](https://go.dev/doc/devel/release#go1.5.minor)
- [go1.4 (released 2014-12-10)](https://go.dev/doc/devel/release#go1.4)[Minor revisions](https://go.dev/doc/devel/release#go1.4.minor)
- [go1.3 (released 2014-06-18)](https://go.dev/doc/devel/release#go1.3)[Minor revisions](https://go.dev/doc/devel/release#go1.3.minor)
- [go1.2 (released 2013-12-01)](https://go.dev/doc/devel/release#go1.2)[Minor revisions](https://go.dev/doc/devel/release#go1.2.minor)
- [go1.1 (released 2013-05-13)](https://go.dev/doc/devel/release#go1.1)[Minor revisions](https://go.dev/doc/devel/release#go1.1.minor)
- [go1 (released 2012-03-28)](https://go.dev/doc/devel/release#go1)[Minor revisions](https://go.dev/doc/devel/release#go1.minor)
****
[点击查看更多细节](https://go.dev/doc/devel/release)
## Go语言的特点
```{tip}
Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率
使用一个表达式来形容Go语言: `Go` = `C` + `字符串` + `垃圾回收` + `并发`
```
- 从c语言中继承了很多理念
包括表达式语法,控制结构,基础数据类型,调用参数传值,指针等等,也保留了和C语言一样的编译执行方式及弱化的指针。
```
// go语言的指针使用特点
func testPtr(num *int) {
*num = 20
}
```
- 引入包的概念
用于组织程序结构,Go语言的一个文件都要归属于一个包,而不能单独存在
- 垃圾回收机制
内存自动回收,不需开发人员管理
```{IMPORTANT}
稍微不注意就会出现内存泄漏
```
- 天然并发
从语言层面支持并发,实现简单`goroutine`,轻量级线程,可实现大并发处理,高效利用多核。基于 `CPS` 并发模型 *Communicating Sequential Processes*实现
- 吸收了管道通信机制
形成go语言特有的管道 `channel` ,通过管道 channel ,可以实现不同的 `goroute` 之间的相互通信
- 函数返回多个值
函数可以返回零到多个值
- 新的创新
比如切片 `slice`,延时执行`defer`等
## Go 还是Golang
**该语言称为 Go**
`golang`绰号的出现是因为该网站最初是*golang.org*。(当时还没有*.dev*域。)不过,许多人使用 golang 名称,它作为标签很方便。例如,该语言的 Twitter 标签是“#golang”。无论如何,该语言的名称只是简单的 Go。
```{important}
虽然官方标志有两个大写字母,但语言名称写的是 Go,而不是 GO
```
## Hello Go
我们写一个最简单的入门代码
:::{tabbed} Hello World
```go
package main
// fmt包中提供格式化,输入和输出的函数
import "fmt"
func main() {
fmt.Println("hello go!")
}
```
:::
:::{tabbed} 控制台输出
```go
hello go!
```
:::
### Golang执行流程分析
每个Go文件都以 `package` 子句开头
- package是一组代码,它们都做类似的事情,比如格式化字符串
- package 子句给出包的名称,这些文件中的代码成为包的一部分
- 在本例中,我们使用特殊的包 main ,如果要直接(通常从终端)运行此代码,这个 main 包是必需的
接下来,Go文件几乎总是有一个或多个 `import` 语句
- 每个文件都需要导入其他包,然后才能使用其他包里包含的代码
- 一次加载计算机上的所有Go代码将导致一个大的、慢速的程序,因此你可以**指定**只导入需要的包
我们可以通过以下命令来进行操作
:::{tabbed} 构建并运行二进制程序
```go
go build hello.go -> hello.exe
```
:::
:::{tabbed} 直接运行
```go
go run hello.go
```
:::

#### 两种执行流程分析
- 如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到**没有 go 开发环境**的机器上,仍然可以运行
- 如果我们是直接 `go run` go源代码,那么如果要在另外一个机器上运行,**也需要 go 开发环境**,否则无法执行。
- 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件变 **大** 了很多。
#### 什么是编译
- 有了`.go`源文件,通过编译器将其编译成机器可以识别的二进制码文件。
- 在该源文件目录下,通过`go build` 对`hello.go`文件进行编译。可以指定生成的可执行文件名,在windows下必须是`.exe`后缀。
- 如果程序没有错误,没有任何提示,会在当前目录下会出现一个可执行文件(windows下是`.exe` Linux下是一个可执行文件),该文件是二进制码文件,也是可以执行的程序。
- 如果程序有错误,编译时,会在错误的那行报错。
## Go语言开发注意事项
- Go源文件以`go`为扩展名
- Go应用程序的执行入口是`main()`方法
- Go语言严格区分**大小**写。
- Go方法由一条条语句构成,每个语句后**不需要分号**`;`(Go语言会在每行后自动加分号),这也体现出Golang的简洁性。
- Go编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错
- Go语言定义的变量或者` import `的包如果没有使用到,代码不能编译通过
- 大括号都是成对出现的,缺一不可。
## Go语言中的转义字符
GoLang常用的转义字符(escape char)
- `\t`:一个制表位,实现对齐的功能
- `\n`:换行符
- `\`:一个`\`
- `\r`:一个回车
## Go语言的优势
**部署简单**
编译生成的是一个静态可执行文件,除了glibc外没有其他外部依赖。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。
**编译快速**
Go编译器非常惊人,它从一开始就被设计得非常快。
**静态链接**
Go编译器支持静态链接。 整个Go项目可以静态地链接到一个庞大的二进制文件中,它可以很容易地部署在云服务器中,而不用担心依赖关系。
**并发性好**
Goroutine和channel使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个Go应用也能有效的利用多个`CPU`核,并行执行的性能好。
**良好的语言设计**
从学术的角度讲Go语言其实非常平庸,不支持许多高级的语言特性;但从工程的角度讲,Go的设计是非常优秀的:规范足够简单灵活,有其他语言基础的程序员都能迅速上手。更重要的是Go 自带完善的工具链,大大提高了团队协作的一致性。
**格式统一**
Gofmt是用来自动格式化go的源代码。 它使用制表符进行缩进,使用空格进行对齐。 无需额外的编码规范,你写的就是源码规范。
**执行性能好**
虽然不如 C 和 Java,但相比于其他编程语言,其执行性能还是很好的,适合编写一些瓶颈业务,内存占用也非常省。
**开源**
最后但同样重要的是,Go是一个开源项目。 你可以参与和贡献到Go项目中。
### 缺陷
**package大部分都在 github上**
- 作者修改项目名称
- 作者删库跑路
- `vendor` 到 `mod` 迁移麻烦,很多遗留依赖问题
**无泛型**
- 2.0 有计划加上 (传言)
- `interface{}`可以解决该问题, 但是不易于代码阅读
**没有Exception**
- 使用Error来处理异常
- `error`处理不太优雅, 很多重复代码
- 不支持动态加载代码库
## Go语言的应用场景
```{tip}
前面的介绍你可能知道了Go语言的优势在哪,却不知道Go语言适合用于哪些地方?Go能干什么
```
**Go语言主要应用在以下领域**
Go语言目前在*云计算*、*容器虚拟化*、*分布式存储*、*网络爬虫*、*运维开发*、*Web开发*、*服务端开发*、*区块链*、*IoT等领域都有所应用*。
### 几个典型的应用场景
**服务端开发**
以前你使用 C 或者 C++ 做的那些事情,用 Go 来做很合适,例如日志处理、文件系统、监控系统等;
**爬虫及大数据**
Go语言天生支持并发,所以十分适合编写分布式爬虫及大数据处理;
**网络编程**
大量优秀的`Web`框架如`Echo`、`Gin`、`Iris`、`beego`等,而且 Go 内置的 `net/http` 包十分的优秀;
**Paas云平台领域**
`Kubernetes`和`Docker Swarm`等;
**分布式存储领域**
`etcd`、`Groupcache`、`TiDB`、`Cockroachdb`、`Influxdb`等;
**区块链领域**
区块链里面有两个明星项目以太坊和fabric都使用Go语言;
**容器虚拟化**
大名鼎鼎的Docker就是使用Go语言实现的。
#### Go微服务开发
- 零依赖,让我们可以更小化我们的`Images`,节省存储与拉取镜像的带宽
- `Runtime`使用更小的内存,相对于`Java`的`JVM`而言
- 更好的并行能力,当年需要更多的CPU的时候
- `High Performance`,对比解释性语言,在处理数据方面有着巨大的优势
- 简单,学习成本低,内部人员可以很快的转入`Go`阵营
- 使用Go能更接近云原生生态,比如`Docker`、`Kubernetes`、`Harbor`等都是用`GoLang`开发的
### Go语言项目
#### Go Project
使用 Go 开发的项目列表:https://github.com/golang/go/wiki/Projects
- Go
- docker
- kubernetes
- lantern
- etcd
- Prometheus
- Influxdb
- Consul
- nsq
- nats
- beego
- ……
#### Go Org
使用 Go 开发的组织:http://go-lang.cat-v.org/organizations-using-go
- 国外:Google、CloudFlare……
- 国内:阿里、腾讯、百度、京东、爱奇艺、小米、今日头条、滴滴、美团、饿了么、360、七牛、B 站、盛大、搜狗……
## 学习Golang的一些方法
- 官网: https://golang.google.cn/doc/
- 不错的gitbook入门:
- [Go语言圣经](https://yar999.gitbook.io/gopl-zh/)
- [Go Web 编程](https://astaxie.gitbooks.io/build-web-application-with-golang/content/zh/)
- 阅读一些优秀的项目的源码
- [kubernetes](https://github.com/kubernetes/kubernetes)
- [nats](https://github.com/nats-io/nats-server)
- [telegraf](https://github.com/influxdata/telegraf)
- [beats](https://github.com/elastic/beats)
- [etcd raft](https://github.com/etcd-io/etcd/tree/main/raft)

```{eval-rst}
.. include:: ../../comment.rst
```