1.1 起源与发展
Go语言起源于2007年,2009年正式对外发布。Go的三个设计者:Robert Griesemer,Rob Pike,Ken Thompson。
时间轴:
- 2007 年 9 月 21 日:雏形设计
- 2009 年 11 月 10日:首次公开发布
- 2010 年 1 月 8 日:当选 2009 年年度语言
- 2010 年 5 月:谷歌投入使用
- 2011 年 5 月 5 日:Google App Engine 支持 Go 语言
1.2 主要特性与影响发展的因素
1.2.1 影响Go的早期语言
Go被誉为“21世纪的C语言”,也就是说,Go是属于C系的,C++,Java,C#等也是属于C系的。所以它的语法有点类C,但是是简化版的,同时,它又包含了一些动态语言的特性,如python,ruby等。
1.2.2 为什么要创造Go
基于现状:Go出来之前,其他语言或多或少都有点不足。比如执行速度快,但编译速度不佳(C++);编译速度快,但执行效率不佳(Java,.net);开发速度快,但是执行速度不佳(动态语言)等,平衡这个现状,就是Go诞生的意义:快速编译,高效执行,快速开发。虽然Go本身也有很多不足。
1.2.3 Go的目标
Go的主要目标是将静态的安全性和动态的易开发性进行有机结合,使得编程变得有趣。因此,Go是一门类型安全和内存安全的编程语言,虽然有指针,但是不允许指针运算。
类型安全就是:语言可以在执行或者编译的时候,检测到类型错误。
内存安全就是:所有的内存访问都有明确的定义,一般是通过某种形式的垃圾回收实现。
对网络通信,并发,并行编程的极佳支持,更多的利用现如今的多核计算机。Go通过goroutine来实现这个目标,goroutine是轻量级的用户级线程,通过通道Channel来进行goroutine之间的通信。这个是Go最强有力的优势。
足够快的构建速度(编译和链接到机器码的速度),小项目几秒就能编程出来,大项目也不会超过几分钟。
严格的,简洁的依赖管理,现在的go mod比之前的包管理好很多。
除了构建速度,执行速度也很快,接近C/C++。
开发者不需要考虑内存管理问题,虽然Go和其他静态语言一样,执行本地代码,但它依旧是运行在某种意义上的虚拟机,就是runtime,实现高效快速的垃圾回收。
Go可以在运行时进行反射操作,可以调用C写的库文件。
1.2.4 设计原则
减少关键词,Go只有25个关键词。
极简,干净,Go对于一个问题,只提供一个到两个方法去解决,比如字符串的形式,python中,可以使用单引号,双引号,三单引号,三双引号,而Go中,只有双引号(单行)和反引号(多行)。
有一套完整的编码规范,有go fmt代码规范工具,使得代码可读性高。
1.2.5 Go的特性
Go没有类和继承,而是通过接口interface实现多态性,通过结构体实现继承。所以它不是传统的面向对象语言,更偏向于函数式编程。
Go是静态语言,所以它是一门类型安全的语言,在本地构建代码,执行速度快。
Go是强类型语言,所以隐式的类型转换是不允许的。
有一些动态语言的特性,比如关键词var。
支持交叉编译,在任意的系统环境都能编译任意的可执行文件,在Linux中也可以开发运行在win的程序。完全支持UTF-8编码。
1.2.6 Go的主要用途
应用于搭载web服务器,存储集群或巨型服务器的系统编程语言。
对于高性能,分布式领域,Go很有优势。
提供海量并行支持,所以对于物联网,游戏服务端开发也很棒。
也可以当成脚本工具语言。
由于垃圾回收和自动分配内存的原因,不适合用来开发对实时性要求很高的软件。
1.2.7 遗弃的特性
- 不支持函数重载和操作符重载。
- 不支持隐式转换。
- 不支持类和继承。
- 不支持变体类型。
- 不支持动态加载代码。
- 不支持动态链接库。
- 不支持静态变量。
- 通过recover和panic代替异常机制。