2022/01/21
2007年9月开始设计,2009年11月推出
每年半年发布一个二级版本
Go 1.0 — 2012 年 3 月 Go 的第一个版本,带着一份兼容性说明文档来保证与未来发布版本的兼容性,进而不会破坏已有的程序
Go 1.1 — 2013 年 5 月 这个 Go 版本专注于优化语言(编译器,gc,map,go 调度器)和提升它的性能
Go 1.2 — 2013 年 12 月 本版本中 test 命令支持测试代码覆盖范围并提供了一个新命令 go tool cover ,此命令能测试代码覆盖率
Go 1.3 — 2014 年 6 月: 这个版本对栈管理做了重要的改进。栈可以申请连续的内存片段,提高了分配的效率,使下一个版本的栈空间降到 2KB
Go 1.4 — 2014 年 12 月: 此版本带来了官方对 Android 的支持,golang.org/x/mobile ) 让我们可以只用 Go 代码就能写出简单的 Android 程序 Go 也提供了 go generate 命令通过扫描用 //go:generate 指示的代码来简化代码生成过程
Go 1.5 — 2015 年 8 月: 实现了自举 这个新版本,发布时间推迟了两个月,目的是在以后每年八月和二月发布新版本 这个版本对 gc 进行了重新设计 这个版本也发布了运行时追踪,用命令 go tool trace 可以查看
Go 1.6 — 2016 年 2 月: 这个版本最重大的变化是使用 HTTPS 时默认支持 HTTP/2 在这个版本中 gc 等待时间也降低了
Go 1.7 — 2016 年 8 月: 这个版本发布了 context 包,为用户提供了处理超时和任务取消的方法 对编译工具链也作了优化,编译速度更快,生成的二进制文件更小,有时甚至可以减小 20% 到 30%
Go 1.8 — 2017 年 2 月: 把 gc 的停顿时间减少到了 1 毫秒以下:其他的停顿时间已知,并会在下一个版本中降到 100 微秒以内 这个版本也改进了 defer 函数
Go 1.9 — 2017 年 8 月: 这个版本支持下面的别名声明:type byte = uint8 sync 包新增了一个 Map 类型,是并发写安全的
Go 1.10 — 2018 年 2 月: test 包引进了一个新的智能 cache,运行会测试后会缓存测试结果。如果运行完一次后没有做任何修改,那么开发者就不需要重复运行测试,节省时间。 为了加快构建速度,go build 命令现在也维持了一份最近构建包的缓存。
Go 1.11 — 2018 年 8 月: 带来了一个重要的新功能包管理:Go modules 第二个特性是实验性的 WebAssembly,为开发者提供了把 Go 程序编译成一个可兼容四大主流 Web 浏览器的二进制格式的能力
Go 1.12 — 2019 年 2 月: 基于 analysis 包重写了 go vet 命令,为开发者写自己的检查器提供了更大的灵活性
Go 1.13 — 2019 年 9 月: 改进了 sync 包中的 Pool,在 gc 运行时不会清除 pool。它引进了一个缓存来清理两次 gc 运行时都没有被引用的 pool 中的实例。 重写了逃逸分析,减少了 Go 程序中堆上的内存申请的空间。
Go1.14 - 2020 年 2 月: 现在 Go Module 已经可以用于生产环境,鼓励所有用户迁移到 Module。 该版本支持嵌入具有重叠方法集的接口。 性能方面做了较大的改进,包括:进一步提升 defer 性能、页分配器更高效,同时 timer 也更高效。 Goroutine 支持异步抢占。
Go1.15 - 2020 年 8 月: Go 链接器现在具有更低的资源使用量,更快的速度以及更高的代码质量。通常,对于大型Go应用程序,链接过程比之前快 20% 左右,而内存使用消耗减少 30% 左右. Go 1.15 二进制文件比Go 1.14 小约5%. Go 对 ARM / ARM64 有了更好的 OpenBSD 支持 现在使用更高内核数的系统,分配的小对象要比之前版本快很多.
Go 1.16 — 2021 年 2 月: embed 包和 //go:embed 指令 增加对 macOS ARM64 的支持 默认启用 Module io/fs 包,不建议使用 io/ioutil 了,因为其中的内容移到 os 和 io 包了
Go 1.17 — 2021 年 8 月: 基于寄存器的调用惯例替代基于堆栈的调用惯例 增加对 Windows ARM64 的支持 新的 //go:build 新版构建约束格式化支持 go.mod 优化 标准库的一些改进
Go1.18 - 2022 年初: 如果您正在更新您的软件包以使用泛型,请考虑将新的泛型API隔离到自己的文件中,并为其使用Go 1.18的构建标签(//go:build go1.18),以便Go 1.17用户可以继续构建和使用非泛型部分。
线上编译环境https://go.dev/play/
本地编译环境
goup(功能方便;对于国内网络比较友好)
如果用线上脚本安装不成功,就用手动安装
```shell ~ % goup --help The Go installer
Usage: goup [flags] goup [command]
Available Commands: default Set the default Go version help Help about any command install Install Go with a version ls-ver List Go versions to install remove Remove Go with a version show Show installed Go upgrade Upgrade goup version Show goup version
Flags: -h, --help help for goup -v, --verbose Verbose
~ % goup install 1.17.6
~ % goup show | VERSION | ACTIVE | |-----------|--------| | 1.17.6 | | | 1.18beta1 | * |
~ % go version go version go1.18beta1 darwin/arm64
go语言主要特征
关键字
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
保留字
Constants: true false iota nil
Types: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
Functions: make len cap new append copy close delete
complex real imag
panic recover
可见性
1)声明在函数内部,是函数的本地值,类似private
2)声明在函数外部,是对当前包可见(包内所有.go文件都可见)的全局值,类似protect
3)声明在函数外部且首字母大写是所有包可见的全局值,类似public
声明方式:var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)。
包管理 mod
编译
Golang内置类型和函数
值类型
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
float32, float64
string
complex64, complex128
array -- 固定长度的数组
指针类型
slice -- 序列数组(最常用)
map -- 映射
chan -- 管道
interface
fonc
内置函数
append -- 用来追加元素到数组、slice中,返回修改后的数组、slice
close -- 主要用来关闭channel
delete -- 从map中删除key对应的value
panic -- 停止常规的goroutine (panic和recover:用来做错误处理)
recover -- 允许程序定义goroutine的panic动作
real -- 返回complex的实部 (complex、real imag:用于创建和操作复数)
imag -- 返回complex的虚部
make -- 用来分配内存,返回Type本身(只能应用于slice, map, channel)
new -- 用来分配内存,主要用来分配值类型,比如int、struct。返回指向Type的指针
cap -- capacity是容量的意思,用于返回某个类型的最大容量(只能用于slice和 map)
copy -- 用于复制和连接slice,返回复制的数目
len -- 来求长度,比如string、array、slice、map、channel ,返回长度
print、println -- 底层打印函数,在部署环境中建议使用 fmt 包