Go语言简介
下一篇:Go环境搭建
前言
Go(又称 Golang)是 Google 的 Robert Griesemer
,Rob Pike
及 Ken Thompson
开发的一种静态强类型、编译型 语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发 计算。
一 诞生
1966年,Ken Thompson 就职于贝尔实验室,参与了 MULTICS 项目,独自开发了 B 语言,并利用一个月时间用B语言开发了一个精简的操作系统,起名 UNICS。后来,同事 Dennis Ritchie 基于 B 语言发明了 C 语言。他们一起用 C 重写了 Unix 系统
Rob Pike 是贝尔实验室 Unix 组成员,也是《Unix环境编程》和《程序设计实践》作者之一。1992年和 Ken Thompson 共同设计了 UTF-8 编码。2002 年加入 Google,研究操作系统。
2006年,Ken Thompson加入Google。2007年9月20日,身处 Google 的 Rob Pike 对不断扩充新特性的 C++ 非常不满,与 Robert Grieseme r(之前参与 JavaScript V8 引擎和 Java HotSpot 虚拟机)、Ken Thompson 进行了一次关于设计一门新语言的讨论。第二天,三人继续进行了对新语言设计的讨论会,并在会后有 Robert Griesemer 发出了一封邮件,总结了设计思路:要在 C 语言基础上,修正一些明显缺陷,删除一些被诟病的特征,增加一些缺失的功能
2007年9月25日,Rob Pike 在一封回复邮件中把新语言命名为 Go
2009年10月30日,Go语言首次公之于众
2009年 11 月 10 日正式开源,这一天被 Go 官方确定为 Go 语言诞生日
Go 语言也拥有了自己的 吉祥物(Rob Pike夫人Renee French设计的地鼠)。Go程序员被称为 Gopher
二 主要版本
2012年3月28日,Go 1.0正式发布
2015年8月19日,Go 1.5这个里程碑版本发布。
- Go不在依赖C编译器,Go编译器和运行时都使用Go代码了,实现了自举
- GOMAXPROCS 的默认值1 改为运行环境的CPU核数
2018年8月25日,Go1.11版本发布
- 引入Go Module包管理机制
2021年2月18日,Go 1.16版本发布
- Go Module-aware 模式成为默认模式,即
GO111MODULE
默认从 auto 改为 on go build/run
命令不再自动更新 go.mod 和 go.sum 文件
2022年3月15日,Go 1.18版本发布
- 引入了 泛型 Generic
- 支持 工作区 Workspace
设计理念
其它语言的弊端
- 对多核CPU缺乏支持。很多语言诞生过早,还停留在单核CPU时代,未对多核CPU并行做优化
- C语言等原生语言缺乏好的依赖管理(C语言依赖头文件)
- Java、C++等语言过于笨重。很小一个需求,也需要很多代码,甚至需要引入很重的框架
- C、C++ 没有提供垃圾回收,这对很多程序员来说并不友好
Go设计者推崇 “最小方式” 思维,即一件事仅有一种方式,或尽可能少的方式去完成。目的是减少开发人员选择的痛苦,减少理解别人选择的苦恼
- 仅有25个关键字,简洁的语法
- 内置垃圾回收器,大大降低程序员管理内存的负担
- 去除隐式类型转换、去除指针算数,提高语言健壮性
- 首字母大小写决定可见性,通过约定而不是声明告诉开发者,提高阅读效率
- 故意 不支持函数默认参数,必须明确每个参数意义,提高设计的清晰度和代码可读性
- 没有面向对象的类,也没有子类,没有构造函数和析构函数
- 偏好 组合
- 任何命名类型都可以拥有方法
- 接口只是方法的集合,其实现是隐式的(无需
implements
显示声明) n--
、n++
都是语句,不是表达式。没有--n
、++n
- 没有 三元运算符
- 内存总是初始化为零值
- 没有异常
- 内置字符串、切片、map等类型
- 内置并发支持,对多核计算机支持友好。goroutine、channel、select就是为并发而生的
- 官方提供了丰富的工具链,涵盖了编译、编辑、依赖获取、调试、文档、性能分析等诸多方面
总结
本节介绍了 Go 的诞生以及其发展的主要版本变化。简述了 Go 语言的设计理念