Go-知识 版本演进

Go-知识 版本演进

  • Go release notes
  • r56(2011/03/16)
  • r57(2011/05/03)
    • Gofix 工具
    • 语言
    • 工具
    • 小修订
  • r58(2011/06/29)
    • 语言
    • 工具
    • 小修订
  • r59(2011/08/01)
    • 语言
    • 工具
  • r60(2011/09/07)
    • 语言
    • 工具
  • [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)
  • [go1.1 2013-05-13](https://golang.google.cn/doc/devel/release#go1.1)
  • [go1.2 2013-12-01](https://golang.google.cn/doc/devel/release#go1.2)
  • [go1.3 2014-06-18](https://golang.google.cn/doc/devel/release#go1.3)
  • [go1.4 2014-12-10](https://golang.google.cn/doc/devel/release#go1.4)
  • [go1.5 2015-08-19](https://golang.google.cn/doc/devel/release#go1.5)
  • [go1.6 2016-02-17](https://golang.google.cn/doc/devel/release#go1.6)
  • [go1.7 2016-08-15](https://golang.google.cn/doc/devel/release#go1.7)
  • [go1.8 2017-02-16](https://golang.google.cn/doc/devel/release#go1.8)
  • [go1.9 2017-08-24](https://golang.google.cn/doc/devel/release#go1.9)
  • [go1.10 2018-02-16](https://golang.google.cn/doc/devel/release#go1.10)
  • [go1.11 2018-08-24](https://golang.google.cn/doc/devel/release#go1.11)
  • [go1.12 2019-02-25](https://golang.google.cn/doc/devel/release#go1.12)
  • [go1.13 2019-09-03](https://golang.google.cn/doc/devel/release#go1.13)
  • [go1.14 2020-02-25](https://golang.google.cn/doc/devel/release#go1.14)
  • [go1.15 2020-08-11](https://golang.google.cn/doc/devel/release#go1.15)
  • [go1.16 2021-02-16](https://golang.google.cn/doc/devel/release#go1.16)
  • [go1.17 2021-08-16](https://golang.google.cn/doc/devel/release#go1.17)
  • [go1.18 2022-03-15](https://golang.google.cn/doc/devel/release#go1.18)
  • [go1.19 2022-08-02](https://golang.google.cn/doc/devel/release#go1.19)
  • [go1.20 2023-02-01](https://golang.google.cn/doc/devel/release#go1.20)
  • [go1.21.0 2023-08-08](https://golang.google.cn/doc/devel/release#go1.21.0)
  • [go1.22.0 2024-02-06](https://golang.google.cn/doc/devel/release#go1.22.0)
  • [go1.23.0 2024-08-13](https://golang.google.cn/doc/devel/release#go1.23.0)
  • 总结

Go release notes

Go 源码:

https://github.com/golang/go.git

官网:

https://go.dev/

早期:

https://golang.google.cn/doc/devel/pre_go1

当前:

https://golang.google.cn/doc/devel/release#pre.go1

下面将按照时间顺序进行梳理下Go语言的演进。

2009-12-09~2012-03-27 (Go 1) 的周会记录:https://golang.google.cn/doc/devel/weekly

r56(2011/03/16)

r56 版本是第一个稳定版本,对应于 weekly.2011-03-07.1。编号从 56 开始,因为在此版本之前,我们现在认为的每周快照被称为版本。

对应的周会记录:

https://golang.google.cn/doc/devel/weekly#2011-03-07

周会记录原文:

This release includes changes to the reflect and path packages.
Code that uses reflect or path may need to be updated.

The reflect package's Value.Addr method has been renamed to Value.UnsafeAddr.
Code that uses the Addr method will have to call UnsafeAddr instead.

The path package has been split into two packages: path and path/filepath.
Package path manipulates slash-separated paths, regardless of operating system.
Package filepath implements the local operating system's native file paths.
OS-specific functionality in package path, such as Walk, moved to filepath.

Other changes:
* build: fixes and simplifications (thanks Dave Cheney),
        move $GOBIN ahead of /bin, /usr/bin in build $PATH.
* bzip2: speed up decompression.
* cgo: fix dwarf type parsing (thanks Gustavo Niemeyer),
        put temporary source files in _obj (thanks Roger Peppe),
        fix bug involving 0-argument callbacks.
* compress/lzw: optimizations.
* doc: add FAQ about "implements",
        add FAQ about large binaries ,
        add FAQ about stack vs heap allocation,
        add internationalization to roadmap,
        describe platform-specific conventions in code.html.
* fmt: allow recursive calls to Fscan etc (thanks Roger Peppe),
        make %#p suppress leading 0x.
* gc, gopack: add some missing flags to the docs.
* gc: fix init of packages named main (thanks Gustavo Niemeyer),
* gob: make recursive map and slice types work, and other fixes.
        tentative support for GobEncoder/GobDecoder interfaces.
* gobuilder: add -package flag to build external packages and -v for verbose.
* gofmt: exclude test file that is not legal Go.
* goinstall: protect against malicious filenames (thanks Roger Peppe).
* goyacc: provide -p flag to set prefix for names, documentation update.
* http: add cookie support (thanks Petar Maymounkov),
        allow handlers to send non-chunked responses,
        export ParseHTTPVersion,
        expose Client's Transport,
        use WriteProxy,
        rename ClientTransport to Transport.
* http/cgi: new package.
* http/httptest: new package.
* image: add a decoding test for common file formats.
* io/ioutil: add TempDir.
* mime/multipart: Header changed from map to MIMEHeader
* path/filepath: new OS-specific path support (thanks Gustavo Niemeyer).
* reflect: add PtrTo, add Value.Addr (old Addr is now UnsafeAddr).
* runtime: use kernel-supplied compare-and-swap on linux/arm.
* spec: minor clarification of scope rule for functions.
* sync/atomic: new package to expose atomic operations.
* syscall: regenerate zerrors_freebsd_amd64.go (thanks Mikio Hara),
        work around FreeBSD execve kernel bug (thanks Devon H. O'Dell).
* template: document the delimiters.
* testing: run GC before each benchmark run (thanks Roger Peppe).
* unsafe: fix the documentation.
* websocket: use httptest.Server for tests (thanks Robert Hencke).
* xml: permit nested directives (thanks Chris Dollin).

简单总结一下:

主要更改概述

  1. reflect 包:

    • Value.Addr 方法重命名为 Value.UnsafeAddr
  2. path 包:

    • 拆分为两个包:path(处理斜杠分隔路径)和 path/filepath(处理本地操作系统的文件路径)。
    • OS-specific 功能(如 Walk)已移至 filepath

其他重要更改

  • 构建系统: 修复和简化,调整 $GOBIN 的位置。
  • 性能优化:
    • bzip2 解压缩速度提升。
    • compress/lzw 优化。
  • 文档更新: 添加多个常见问题解答,更新代码文档。
  • HTTP 包:
    • 新增 cookie 支持。
    • 允许非分块响应。
    • 重命名 ClientTransport。
  • 新包: 新增 http/cgihttp/httptest 包。
  • 其他改进:
    • io/ioutil 添加 TempDir
    • mime/multipart 的 Header 类型更改。
    • sync/atomic 新增原子操作包。
    • testing 在基准测试前运行 GC。

其他修复和改进

  • 修复了多个包中的错误和文档问题,增强了安全性和功能性。

r57(2011/05/03)

r57 版本 weekly.2011-04-27 与附加错误修复相对应。

Gofix 工具

新的gofix工具会查找使用旧 API 的 Go 程序,并重写它们以使用较新的 API。在您更新到新的 Go 版本后,gofix 会帮助对您的程序进行必要的更改。Gofix 将处理下面描述的 http、os 和 syscall 包更改,我们将更新程序以跟上库的未来更改。Gofix 无法完美处理所有情况,因此请在提交更改之前阅读并测试它所做的更改。有关更多信息,请参阅gofix 博客文章。

这应该是为了处理兼容的一个升级工具。

语言

多重赋值语法取代了closed函数。通道接收的语法允许可选的第二个赋值,即一个布尔值,表示通道是否关闭。此代码:

	v := <-ch 
	if closed(ch) { 
		// 通道已关闭
	}

现在应该写成:

	v, ok := <-ch 
	if !ok { 
		// 通道已关闭
	}

未使用的标签现在是非法的,就像未使用的局部变量一样。

gob 包现在将对实现GobEncoder和 GobDecoder接口的类型的值进行编码和解码 。这允许具有未导出字段的类型传输自洽描述;示例包括 big.Int和big.Rat。

http 包已经重新设计。对于客户端,有了新的 Client和Transport 抽象,可以更好地控制 HTTP 细节,例如发送的标头和随后的重定向。这些抽象可以轻松实现添加功能(例如OAuth2 )的自定义客户端。对于服务器,ResponseWriter 已删除其非必要方法。Hijack 和 Flush 方法不再是需要的;代码可以通过检查特定值是否实现 Hijacker或Flusher来测试它们。RemoteAddr 和 UsingTLS 方法被Request的 RemoteAddr 和 TLS 字段取代。SetHeader 方法被 Header 方法取代;其结果为Header类型,实现了 Set 和其他方法。

net 包 删除了Dialladdr中的参数 和LookupHost中的返回值。现在,实现使用cgo来实现网络名称查找,如果可能的话,使用 C 库 getaddrinfo(3) 函数。这确保了 Go 和 C 程序以相同的方式解析名称,同时还避开了 OS X 应用程序级防火墙。 cname

os 软件包 引入了简化的Open 和Create函数。原来的 Open 函数现在可用作OpenFile 函数。StartProcess函数的最后三个参数已被指向ProcAttr 的 指针所取代。

重新设计了 reflect 包。Type现在是一个实现所有可能的类型方法的接口。类型开关不再是 Type ,而是 switch on 。Value 现在是一个实现所有可能的值方法的结构体值。类型开关不再是 Value ,而是switch on 。Typeof 和 NewValue 现在被称为TypeOf和ValueOf 。 要创建可写的 Value ,请使用而不是。有关完整详情,请参阅变更说明 。新 API 允许更有效地实现 Value ,从而避免了以前 API 所需的许多分配。 t``t.Kind()``v``v.Kind()``New(t).Elem()``Zero(t)

请记住,gofix 将处理这些包 API 更改所需的大部分重写。

工具

上面介绍了一个新的命令Gofix 。

Gotest现在是一个 Go 程序,而不是 shell 脚本。新-test.short标志与包测试的 Short 函数相结合,允许您编写可以在正常或“短”模式下运行的测试;all.bash 以短模式运行测试以减少安装时间。Makefile 知道该标志:使用make testshort

这可能就是 go test 的雏形

运行时支持现在实现了 CPU 和内存分析。Gotest 的新 -test.cpuprofile-test.memprofile标志使分析测试变得容易。要将分析添加到您的 Web 服务器,请参阅http/pprof 文档。有关其他用途,请参阅运行时/pprof文档。

go 的 pprof 的雏形

小修订

r57.1 修复了http.FormFile 中的零指针取消引用。

r57.2 修复了程序中误用未初始化内存的问题goto

r58(2011/06/29)

r58 版本 weekly.2011-06-09 与附加错误修复相对应。

语言

此版本修复了程序中滥用未初始化内存的问题goto

与往常一样,gofix将处理这些包 API 更改所需的大部分重写。

包 http删除了Client.GetfinalURL方法的返回值。该值现在可通过http.Response上的新字段获取。map[string][]string 类型的大多数实例已被新的Values类型替换。 Request

包 exec已经重新设计,具有更方便、更简洁的 API。

包 strconv的Quote函数现在仅转义那些未被unicode.IsPrint 归类为可打印的 Unicode 代码点。以前 Quote 会转义所有非 ASCII 字符。这也会影响fmt包的"%q" 格式化指令。以前的引用行为仍可通过 strconv 的新QuoteToASCII函数获得。

包 os/signal的 Signal和 UnixSignal类型已被移至 os包。

包 image/draw是 的新名称 exp/draw。 中的 GUI 相关代码exp/draw现在位于exp/gui包中。

工具

Goinstall现在观察 GOPATH 环境变量来在 Go 树之外构建和安装您自己的代码和外部库(并避免编写 Makefile)。

小修订

r58.1 增加了 构建和 运行时 更改,以使 Go 在 OS X 10.7 Lion 上运行。

r59(2011/08/01)

r59 版本对应于 weekly.2011-07-07

语言

此版本包含一项语言更改,限制了 的使用 goto。本质上,goto块外的语句不能跳转到该块内的标签。如果您的代码使用 ,则可能需要进行更改goto。请参阅此变更集,了解新规则如何影响 Go 树。

与往常一样,gofix将处理这些包 API 更改所需的大部分重写。

软件包 http有一个新的 FileSystem接口,可用于访问文件。FileServer助手现在接受 参数,FileSystem而不是显式文件系统根目录。通过实现您自己的功能,FileSystem您可以使用它 FileServer来提供任意数据。

软件包 os的ErrorString类型已被隐藏。 的大部分用法都可以用os.NewErroros.ErrorString代替 。

reflect 包支持一种新的结构标签方案,允许在多个包之间共享结构标签。在此方案中,标签必须采用以下格式:

`key:"value" key2:"value2"`

StructField类型的 Tag 字段现在具有StructTag类型,它具有一个 方法。json 和 xml 的客户端需要更新 。代码 如下Get

type T struct {
		X int "name"
}

应该成为

type T struct {
		X int `json:"name"`  // or `xml:"name"`
}

使用govet来识别需要更改以使用新语法的结构标签。

go vet 的雏形

包 sort的IntArray类型已重命名为IntSlice , Float64Slice和 StringSlice也类似 。

包 strings的Split函数本身已被拆分为Split和 SplitN。 SplitN与旧的相同Split。新的Split相当于SplitN最后一个参数为 -1。

包 image/draw的 Draw函数现在接受一个附加参数,即合成运算符。如有疑问,请使用draw.Over。

工具

Goinstall现在可以从任意远程存储库(不仅仅是 Google Code、GitHub 等)安装软件包和命令。有关详细信息,请参阅goinstall 文档。

go install 的雏形

r60(2011/09/07)

r60 版本对应于 weekly.2011-08-17

语言

现在,“else”块必须带有括号,除非“else”的主体是另一个“if”。由于 gofmt 始终会添加这些括号,因此 gofmt 格式的程序不会受到影响。要修复其他程序,请运行 gofmt。

软件包 http的 URL 解析和查询转义代码(例如ParseURLURLEscape)已移至新的url 软件包,并对名称进行了一些简化。客户端代码可以使用 gofix 自动更新。

软件包 imagePix对结构类型(如 image.RGBA和 image.NRGBA )的字段进行了重大更改 。但是, image.Image接口类型没有改变,如果您没有明确引用字段,则无需更改代码Pix。例如,如果您使用image/jpeg软件包解码多个图像,使用 image/draw合成它们,然后使用 image/png对结果进行编码,那么您的代码应该仍能像以前一样工作。如果您的代码确实引用了Pix字段,请参阅 weekly.2011-07-19 快照说明,了解如何更新代码。

模板包已被替换为新的模板包(以前为exp/template)。原始模板包仍可用作old/template。该old/template包已弃用并将被删除。Go 树已更新为使用新的模板包。我们鼓励旧模板包的用户切换到新模板包。使用 template或 的代码exp/template需要将其导入行分别更改为"old/template""template"

工具

Goinstall现在使用新的标签选择方案。下载或更新时,goinstall 会查找具有 "go."与本地 Go 版本相对应的前缀的标签或分支。对于 Go, release.r58它会查找go.r58。如果未找到特定go.X标签或分支,它会选择最接近的早期版本。如果找到合适的标签或分支,goinstall 将使用该版本的代码。否则,它使用版本控制系统选择的默认版本。鼓励库作者在其存储库中使用适当的标签或分支名称,以使他们的库更易于访问。

小修订

go1 2012-03-28

Go 1 是 Go 的一个主要版本,将长期保持稳定。

我们的目标是,为 Go 1 编写的程序将在 Go 1 的未来版本中继续正确编译和运行,无需任何更改。

这是 go 语言保证向后兼容。

go1 版本对应的是 weekly.2012-03-27

小修订

go1.0.1(发布于 2012-04-25)是为了 修复可能导致内存损坏的逃逸分析错误而发布 的 。它还包括一些小的代码和文档修复。

go1.0.2 (发布于 2012-06-13) 发布,用于修复使用结构体或数组键的映射实现中的两个错误: 问题 3695和 问题 3573。它还包括许多小代码和文档修复。

go1.0.3(发布于 2012-09-21)包含一些小代码和文档修复。

go1.1 2013-05-13

go 1.1 的 release notes

https://golang.google.cn/doc/go1.1

语言特性

  1. 除0异常: 整数除以常数零会产生运行时恐慌
  2. Unicode 增强
  3. 方法
  4. 不强制要求 return

更新

  1. gcc 和 go 版本存在差距
  2. go 工具传参格式(后续 flag 相关)
  3. 明确数字类型:int => int32,in64,uint32,uint64
  4. 堆大小扩大(64位os)
  5. unicode 代理不支持的 utf-8
  6. race:竞态检测

工具

  1. go vet 对上述更新的支持
  2. go build 更详细的信息
  3. go get 需要先配置 $GOPATH
  4. go test 允许保留输出文件
  5. go fix 不在推荐使用: go fix 是为了解决go每次不兼容更新的代码重写的,现在 go 已经保证了向后兼容,go fix 就没有意义了。

性能优化

标准库更新

  1. 输入输出提供简单易用的函数bufio.Scanner
  2. net 库对 地址的检测
  3. reflect 包对类型的支持
  4. time 包对时间的精度处理
  5. 新增 go fmt go/format
  6. net/http/cookie 对 cookie 的支持
  7. runtime/race 这个是竞态检测的运行时实现
  8. 其他库的调整

go1.2 2013-12-01

go 1.2 的 release notes

https://golang.google.cn/doc/go1.2

语言特性

  1. 空指针nil: 编译器会检测nil地址的访问,同时运行时如果访问nil地址,会导致程序 panic https://go.googlesource.com/proposal/+/refs/heads/master/design/4238-go12nil.md
  2. 切片支持三个参数,start,end,cap https://blog.csdn.net/a18792721831/article/details/135716705

更新

  1. goroutine 调度防止饿死,可进行抢占
  2. 设置默认1万的goroutine数,可设置
  3. 扩充 goroutine 的堆栈大小 4k->8k
  4. go vet 和 godoc 调整为 tools子库(当前go doc 和 godoc 不是同一个)
  5. go test 支持覆盖率 支持-cover 参数,运行后将进行插桩,运行结束后会统计覆盖率
  6. 删除 go doc ,保留了 godoc

标准库更新

  1. tar,zip 的性能优化
  2. 新增 encoding 包
  3. fmt 对格式串的增强
  4. template 的模板语法中,对运算符的支持,并且增强了 if-else : https://blog.csdn.net/a18792721831/article/details/144357215
  5. 新增 image/color/palette
  6. 其他库的调整

go1.3 2014-06-18

go 1.3 的 release notes

https://golang.google.cn/doc/go1.3

兼容的os

  1. 不在支持 win 2000
  2. 支持 DragonFly BSD,FreeBSD,Solaris,Plan 9

语言特性

  1. 明确了channel 的一些特性:https://github.com/golang/go/issues/6242,https://blog.csdn.net/a18792721831/article/details/135885482

更新

  1. goroutine 的堆栈分配从分段调整为连续模型:https://docs.google.com/document/d/1wAaf1rYoM4S4gtnPh0zOlGzWtrZFQ5suE8qr2sD8uWQ/pub
  2. 将整数类型值使用 unsafe.Pointer转为指针是非法的
  3. map 的迭代随机,多次迭代,不保证顺序相同,防止出现顺序依赖编码:https://blog.csdn.net/a18792721831/article/details/135886263 next调用
  4. Build 优化
  5. go test , go run 支持 -exec ,godoc 支持 -analysis (更加丰富的 doc )
  6. bench 的 优化:https://blog.csdn.net/a18792721831/article/details/140094738
  7. 性能优化:defer , gc, race ,regexp

标准库更新

  1. Crypto/tls 中 TLS 的强制验证
  2. 新类型 sync.Pool
  3. testing.B 支持 RunParallel:https://blog.csdn.net/a18792721831/article/details/140094738
  4. 其他库的更新

go1.4 2014-12-10

go 1.4 的 release notes

https://golang.google.cn/doc/go1.4

操作系统

  1. 安卓:go 1.4 可以为 android 的 arm 处理器构建二进制文件,还可以构建库,让安卓程序使用:https://docs.google.com/document/d/1N3XyVkAP8nmWjASz8L_OjjnjVKxgeVBjIsTr5qIUcA4/edit?tab=t.0#heading=h.9habv2sr5bec
  2. 支持arm的 native client
  3. 支持Plan9的amd64处理器

语言特性

  1. for循环支持 for range x ,比如进行x 次循环
  2. 不支持双重指针:var x **T 这是不允许的,go语言自动解引用一次,但是不能解两次,而且会编译报错

兼容性说明

  1. 使用 unsafe 包,不会保证百分百兼容。因为 unsafe 包本身就是直接使用数据或者地址,破坏go类型系统的操作。所以go不会保证unsafe的编码也是完全兼容的。

更新

  1. go 的 gc 使用go编码实现,之前是 c和汇编,之前是不同的语言,导致获取信息可能会有偏差等转换,现在使用相同的语言,那么信息就可以无缝获取和查询,性能会更好:https://docs.google.com/document/d/1wAaf1rYoM4S4gtnPh0zOlGzWtrZFQ5suE8qr2sD8uWQ/pub

    因为不需要做转换,所以程序的堆会更小,并且堆栈不在分段,堆栈满了就申请一个更大的堆栈。分段堆栈->连续堆栈

    使用了连续堆栈,初始堆栈的大小从 8192 -> 2048 也就是2k.并且不会受到限制,2k不够用了,会申请一个更大的。

  2. 降低了go调用汇编程序的难度,只需要在go里面声明汇编

  3. 新增“内部包”,将不希望公开的代码放在 internal (子)目录下,就不会被公开,从1.5 开始强制执行:https://docs.google.com/document/d/1e8kOo3r51b2BWtTs_1uADIA5djfXhPT36s6eHVRIvaU/edit?tab=t.0

  4. 当一个包有多个路径(存档)时,可以指定使用哪个:https://docs.google.com/document/d/1jVFkZTcYbNLaTxXD9OcGfn7vYv5hWtPx9–lTx1gPMs/edit?tab=t.0

  5. go的代码库从 code.google.com 调整为 golang.org

  6. 新增 go generate 工具

  7. 根据文件名控制是否参与编译。test_arm.go,test_windows.go 。在不同的编译环境中,选择不同的文件进行编译

  8. go test 支持 -o 参数,允许编译生成 测试执行文件,并且会编译 *_test.go 文件,并不会因为没有测试函数而忽略

  9. 一些杂项信息从go中移出:https://golang.google.cn/wiki/IDEsAndTextEditorPlugins

标准库更新

  1. Scanner 包修复bug
  2. syscall 被冻结,取之的是 sys 包
  3. Testing.M 的支持:https://blog.csdn.net/a18792721831/article/details/140094681
  4. 其他库的更新

go1.5 2015-08-19

go 1.5 的 release notes

https://golang.google.cn/doc/go1.5

操作系统

  1. 逐步减少 32 位的 x86 架构
  2. 新增 darwin/arm, darwin/arm64,linux/arm64

语言特性

  1. map 的初始化简化,不需要列出key的类型,可以省略key的类型

更新

  1. go 的编译彻底与 gcc 分开,不在依赖gcc。

  2. 编译后可执行文件的后缀做了处理,直接是二进制文件

  3. 并发gc:https://docs.google.com/document/d/16Y4IsnNRCN43Mx0NZc5YXZLovrHvvLhK_h0KN8woTO4/edit?tab=t.0 , https://golang.google.cn/talks/2015/go-gc.pdf

    在这里插入图片描述

    从线性关系变成常数关系,牛

  4. 新增参数定义核心数 GOMAXPROCS

  5. go vet 和 go cover 移动存储位置(还是能用的,只是源码结构调整)

  6. 内部包开始强制执行

  7. vendor开始试验:https://go.googlesource.com/proposal/+/master/design/25719-go15vendor.md

  8. go tool trace 跟踪工具支持:https://golang.google.cn/talks/2015/dynamic-tools.slide#1

  9. go doc 的增加,go doc 适合在命令行下使用,godoc 适合窗口下使用

标准库更新

  1. flag 的 优化
  2. Math/big的Float 支持任意精度浮点数
  3. net库的DSN解析优先使用go访问,而不是cgo
  4. reflect包新增ArrayOf和FuncOf
  5. 模糊测试 Fuzz 的强化:https://blog.csdn.net/a18792721831/article/details/140361151
  6. 其他库的更新

go1.6 2016-02-17

go 1.6 的 release notes

https://golang.google.cn/doc/go1.6

操作系统

  1. Linux/mips64,linux/mips64le 试验
  2. android/386试验
  3. 在 FreeBSD上,使用 clang而不是gcc

更新

  1. cgo中go和c共享内存
  2. 编译器的优化
  3. go doc 的优化,优先使用已下载副本

性能优化

compress/bzip2compress/gzipcrypto/aescrypto/ellipticcrypto/ecdsasort包性能提升 10% 以上

标准库更新

  1. HTTP/2 的支持
  2. go程序对操作系统更丰富的信号量处理
  3. encoding/json,encoding/xml的优化
  4. Sort 包重写
  5. template语法支持忽略空:https://blog.csdn.net/a18792721831/article/details/144357215
  6. 其他库的更新

go1.7 2016-08-15

go 1.7 的 release notes

https://golang.google.cn/doc/go1.7

操作系统

  1. macOS 10.12 Sierra 支持
  2. Linux/s390x , plan9/arm 支持
  3. Linux/mips64,linux/mips64le支持

更新

  1. go get 支持 git.openstack.org
  2. go doc 支持函数类型分组
  3. go tool dist list 打印支持的os
  4. go tool trace 的优化

标准库更新

  1. 支持子测试:https://blog.csdn.net/a18792721831/article/details/140398359
  2. Context 升级为标准库中的包:https://blog.csdn.net/a18792721831/article/details/139374825
  3. 引入 httptrace
  4. 程序所有问题都统一到 error
  5. 性能优化
  6. TLS 支持加强
  7. Unicode 升到 9.0
  8. 其他标准库的更新(挺多的)

go1.8 2017-02-16

go 1.8 的 release notes

https://golang.google.cn/doc/go1.8

语言特性

  1. 当两个 struct 除 tag 之外的其他结构都相同时,允许进行互转

操作系统

  1. 仍然支持 OS X 10.8 且可能是最后一个支持的 Go 版本
  2. 最后一个支持 ARMv5E和ARMv6的版本

更新

  1. 删除了go tool yacc 工具,从 1.7 开始编译器不在使用 yacc
  2. pprof支持http分析
  3. go tool trace 支持 -pprof 参数
  4. GOPATH 有默认值,$HOME/go ,%USERPROFILE%/goWindows
  5. go bug 命令在 github 上报 issues ,并预填信息
  6. go gc 的 STW 平均在 100 微秒以下:https://github.com/golang/proposal/blob/master/design/17503-eliminate-rescan.md
  7. defer 函数的开销减少一半:https://blog.csdn.net/a18792721831/article/details/140734394
  8. Http 的 Shutdown 优雅停止
  9. sql支持context
  10. 标准库的更新

go1.9 2017-08-24

go 1.9 的 release notes:

https://golang.google.cn/doc/go1.9

语言特性

  1. 类型别名 : type S1 = S2,S1和S2都表示同一种类型

更新

  1. 并行编译,充分利用多核优势,默认启用
  2. go env -json 支持json 格式输出
  3. go test 支持 -list regexp 进行执行测试

标准库更新

  1. Math/bits 位操作的视线
  2. Sync 包的支持
  3. sync.Mutex优化:https://blog.csdn.net/a18792721831/article/details/139377732

go1.10 2018-02-16

go 1.10 的 release notes

https://golang.google.cn/doc/go1.10

语言特性

  1. 支持位操作结果作为索引:x[2<<y]

更新

  1. GOROOT 和 GOTMPDIR 尝试从可执行文件的目录推断
  2. GOPATH 的调整:https://blog.csdn.net/a18792721831/article/details/142862157
  3. go install 不在下载依赖包
  4. go test 缓存结果

go1.11 2018-08-24

go 1.11 的 release notes

https://golang.google.cn/doc/go1.11

JavaScript

  1. WebAssembly 实验性端口
  2. 支持syscall调用 js
  3. 支持 *_js.go

更新

  1. module 试验:https://blog.csdn.net/a18792721831/article/details/143203722 , https://blog.csdn.net/a18792721831/article/details/143722028 , https://blog.csdn.net/a18792721831/article/details/144210904
  2. go 不支持导入 含有 @ 的路径
  3. 构建缓存
  4. godoc命令行将不在支持,使用 go doc 进行命令行查看
  5. go run 支持dir,pkg,.
  6. template支持变量

go1.12 2019-02-25

go 1.12 的 release notes

https://golang.google.cn/doc/go1.12

操作系统

  1. race 支持 linux/arm64

更新

  1. go tool vet 不在支持,而是使用 go vet
  2. go 教程不在包含在发行文件中了,需要手动安装
  3. module 的进一步增强,包括 go.mod,go get ,go list ,go mod download 等

标准库更新

  1. TSL 1.3 支持
  2. template的错误信息不会被截断了

go1.13 2019-09-03

go 1.13 的 release notes

https://golang.google.cn/doc/go1.13

语言特性

  1. 多进制支持:2,8,16,虚数

操作系统

  1. 兼容 android 10

更新

  1. module 默认为 auto,支持 GOPRIVATE,GOPROXY,GONOSUMDB等变量
  2. go env -w 的支持
  3. go get -u 和 go get -u all
  4. 对 +incompatible 的处理
  5. 支持伪版本
  6. defer 性能提升 30%:https://blog.csdn.net/a18792721831/article/details/140734394

标准库更新

  1. TLS 1.3 支持
  2. 支持 %w 的error包装:https://blog.csdn.net/a18792721831/article/details/140430350

go1.14 2020-02-25

go 1.14 的 release notes

https://golang.google.cn/doc/go1.14

语言特性

  1. 支持重复命名:https://github.com/golang/proposal/blob/master/design/6977-overlapping-interfaces.md

操作系统

  1. 进一步不在支持 32位os

更新

  1. vendor 的正式使用

  2. module 进一步优化

  3. +incompatible 的支持

  4. Go.mod 文件的维护

  5. goroutine 支持异步抢占

标准库更新

  1. hash 包的增加,基于字节的 hash
  2. 进一步优化 TSL 1.3
  3. template 错误提示优化

go1.15 2020-08-11

go 1.15 的 release notes

https://golang.google.cn/doc/go1.15

更新

  1. GOPROXY 支持跳过返回错误的代理
  2. go test 关于 缓存和timeout的优化
  3. GOMODCACHE 环境变量支持

标准库更新

  1. Time/tzdata 允许将时区数据库集成到程序中
  2. Flag 对于no-flag 的处理

go1.16 2021-02-16

go 1.16的 release notes

https://golang.google.cn/doc/go1.16

更新

  1. Module 默认启用
  2. go build 和 go test 不在修改 go.mod 和 go.sum
  3. go install 支持 version
  4. go mod tidy 和 go mod vendor 支持 -e 表示出错继续
  5. io 取代 fs 包
  6. ioutil的函数移动到os或者io包
  7. Template 支持更多加载方式

go1.17 2021-08-16

go 1.17 的release notes

https://golang.google.cn/doc/go1.17

语言特性

  1. 切片到数组指针的转换
  2. Unsafe 包的增强

更新

  1. module 进一步支持,并转为正式,支持 go mod tidy -go=1.17, go mod tidy -compat=1.17 等
  2. Go mod graph 的支持性更强
  3. go.mod 的进一步增强
  4. vendor 的增强:https://blog.csdn.net/a18792721831/article/details/143027712
  5. // go:build 优先使用
  6. go run 支持version
  7. 关于 errors 的方法增强
  8. 标准库 URL 的校验,针对 query 参数的强化
  9. go test 支持 shuffle

go1.18 2022-03-15

go 1.18 的 release notes

https://golang.google.cn/doc/go1.18

语言特性

  1. 支持泛型,这是一个很大的变化:https://blog.csdn.net/a18792721831/article/details/142862019 , https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md
  2. 基于泛型,增加的 sdk constraints,slices,maps 的相关方法

更新

  1. 编译期间,如果有定义但未使用的变量,将给出提示,并阻止编译
  2. 对模糊测试的增强并正式发布:https://github.com/golang/go/issues/44551 , https://blog.csdn.net/a18792721831/article/details/140361151
  3. go work 的支持,支持工作区模式
  4. 新的 net/netip 包
  5. 默认禁用 TSL 1.0 和 1.1
  6. go test 中对 regexp 进一步增强
  7. template 的 for-condition 的支持

go1.19 2022-08-02

go 1.19 的 release notes

https://golang.google.cn/doc/go1.19

内存模型

  1. 与其他语言保持一致的内存模型:https://golang.google.cn/ref/mem , https://blog.csdn.net/a18792721831/article/details/137244768
  2. Sync.atomic 的引入,提供了一些原子操作

更新

  1. 对注释的增强:https://blog.csdn.net/a18792721831/article/details/144833294
  2. go generate,go test,go env ,go list 的强化
  3. 支持设置程序的内存空间 , SetMemoryLimit
  4. 对 switch 使用跳转表优化,性能优化 20%

go1.20 2023-02-01

go 1.20 的 release notes

https://golang.google.cn/doc/go1.20

语言特性

  1. go 1.17 支持从切片到数组指针的转换,go 1.20 支持从切片到数组的转换
  2. unsafe 包增强
  3. 可比较类型:实现了 comparable 接口

更新

  1. go 1.20 是最后一个支持 win 7 的版本,后面要求 win10
  2. go test -json 继续加强
  3. go build 和 go test 不支持 -i 参数(从1.16开始标记弃用)
  4. go test 和 go generate 支持 -skip
  5. 升级了 errors的个数,从单个变成多个,支持包装多个
  6. Fmt.Errorf支持多个%w包装

go1.21.0 2023-08-08

go 1.21 的 release notes

https://golang.google.cn/doc/go1.21

兼容性

  1. 改进兼容性声明:https://golang.google.cn/doc/go1.21#tools
  2. 版本编号更改:从2位版本号,变成三位版本号,换句话说,go 1.21 正确的版本应该是 go 1.21.0

语言特性

  1. 新增内置函数 : min,max,clear
  2. 优化包初始化顺序:对导入包排序,查找第一个导入包并从列表删除(不断循环重复)
  3. 提升类型推断的能力和精度,因为在 go 1.18 中加入了泛型,那么对类型推断来说是个很大的挑战:https://golang.google.cn/ref/spec#Type_inference
  4. for 循环考虑迭代,而不是循环,这表示后续可能支持在 for 循环中对被迭代对象进行操作。一边遍历一边删除

更新

  1. go test 多个参数的能力增强
  2. 编译优化 pgo(go 1.20 加入) 构建速度提升 6%
  3. 堆栈打印不在打印前100个堆栈,而是前50个和后50个
  4. 新增 log/slog 包,用于结构化日志
  5. 切片的操作增强
  6. map的操作增强
  7. cmp包对排序的增强
  8. Context 的增强
  9. Sync.Once 的增强

go1.22.0 2024-02-06

go 1.22.0 的 release notes

https://golang.google.cn/doc/go1.22

语言特性

  1. for 循环中,不在共享变量,解决了for循环中如果是指针,那么闭包取到最后一个元素的问题:https://blog.csdn.net/a18792721831/article/details/135886263
  2. for 循环可以遍历整数 for range 10

更新

  1. go work 支持设置 vendor 目录
  2. 优化 go tool trace 的ui
  3. pgo的更大规模的取消虚拟调用,进一步优化编译速度
  4. 标准sdk中第一个 v2 包,math/rand/v2 ,v2 表示不兼容升级,所以才会增加
  5. http 路由的增强

go1.23.0 2024-08-13

go 1.23.0 的 release notes

https://golang.google.cn/doc/go1.23

语言特性

  1. For-range 循环支持迭代器函数:https://golang.google.cn/issue/56413 , https://golang.google.cn/blog/range-functions
  2. 对泛型类型别名的支持

更新

  1. go 工具开始收集使用情况和故障统计信息,帮助 go 分析go 工具的使用和后续演变: https://telemetry.go.dev/

    可以看出,大部分go的使用者还是使用 go 1.17
    在这里插入图片描述

  2. go mod tidy -diff 展示差异,不会修改文件

  3. 对 time.Timer和time.Ticker 进行优化,不在复用相关对象,而是用完马上回收,并且触发操作变为非阻塞:https://blog.csdn.net/a18792721831/article/details/142415290

  4. 新的 unique 包,规范化值的操作

  5. 迭代器 iter 包,支持用户自定义迭代

总结

梳理一下go语言发展历史,可以看到一个编程语言,从发布第一版,到快速迭代,到标准规范,到逐渐趋于稳定,到对更多的os的支持,到性能的不断提升和优化。

梳理一遍go语言发展历史,可以对go语言的过去,当下和未来有了更清晰的认知。

算算日子,go 1.24.0 差不多在 2025-02 到来,不知道又会有哪些优化呢

https://tip.golang.org/doc/go1.24

go 1.24.0 包含的变更

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956126.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pycharm+pyside6+desinger实现查询汉字笔顺GIF动图

一、引言 这学期儿子语文期末考试有一道这样的题目&#xff1a; 这道题答案是B&#xff0c;儿子做错了选了C。我告诉他“车字旁”和“车”的笔顺是不一样的&#xff0c;因为二者有一个笔画是不一样的&#xff0c;“车字旁”下边那笔是“提”&#xff0c;而“车”字是“横”&am…

Red Hat8:搭建DHCP服务器

1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 &#xff08;搭建的时候用vim 自行定义文件名.repo或者是vi 自行定义文件名.repo&#xff09; 5、安装dhcp-server 6、复制模板文件 dhcpd.conf 是DHCP服务的配置文件&#xff0c;DHCP服务所有参数都是通过修改dhcpd.co…

Web前端------HTML链接标签

1.普通超链接 &#xff08;1&#xff09;链接外部网页 点击文本&#xff0c;跳转到外部网页 <!DOCTYPE html><html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…

linux下springboot项目nohup日志或tomcat日志切割处理方案

目录 1. 配置流程 2. 配置说明 其他配置选项&#xff1a; 3. 测试执行 4. 手动执行 https://juejin.cn/post/7081890486453010469 通常情况下&#xff0c;我们的springboot项目部署到linux服务器中&#xff0c;通过nohup java -jar xxx.jar &指令来进行后台运行我们…

每日进步一点点(网安)

1.BUU CODE REVIEW 1 先看源代码 <?phphighlight_file(__FILE__);class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(uniqid());if($this->correct $this->input) {ec…

2025.1.19机器学习笔记:PINN文献精读

第三十周周报 一、文献阅读题目信息摘要Abstract创新点物理背景网络框架实验实验一&#xff1a;直道稳定流条件实验二&#xff1a;环状网络中的非稳定流条件 结论缺点及展望 二、代码实践总结 一、文献阅读 题目信息 题目&#xff1a;《Enhanced physics-informed neural net…

移动端布局 ---- 学习分享

响应式布局实现方法 主流的实现方案有两种: 通过rem \ vw/vh \ 等单位,实现在不同设备上显示相同比例进而实现适配. 响应式布局,通过媒体查询media 实现一套HTML配合多套CSS实现适配. 在学习移动端适配之前,还需要学习移动端适配原理: 移动端适配原理(Viewport) 了解VSCo…

STM32 FreeROTS 任务创建和删除实验(静态方法)

实验目标 学会 xTaskCreateStatic( )和 vTaskDelete( ) 的使用&#xff1a; start_task&#xff1a;用来创建其他的三个任务。task1&#xff1a;实现LED1每500ms闪烁一次。task2&#xff1a;实现LED2每500ms闪烁一次。 task3&#xff1a;判断按键KEY1是否按下&#xff0c;按…

家政服务小程序,打造智慧家政新体验

春节即将来临&#xff0c;家政市场呈现出了火热的场景&#xff0c;大众对家政服务的需求持续增加。 近年来&#xff0c;家政市场开始倾向数字化、智能化&#xff0c;借助科学技术打造家政数字化平台&#xff0c;让大众在手机上就可以预约家政服务&#xff0c;减少传统家政市场…

《贪心算法:原理剖析与典型例题精解》

必刷的贪心算法典型例题&#xff01; 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法1——数塔问题-CSDN博客 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法&#xff08;蓝桥杯&#xff09;贪心算法3——二维数组排序与贪心算…

Vue3 nginx 打包后遇到的问题

前端vite文件配置 export default defineConfig({plugins: [vue(),DefineOptions()],base:./,resolve:{alias:{:/src, //配置指向src目录components:/src/components,views:/src/views}},server:{// host:0.0.0.0,// port:7000,proxy:{/api:{target:xxx, // 目标服务器地址 &am…

linux下配置python环境及库配置

概述 使用Linux作为开发环境拥有完整的开源工具链且易于通过系统包管理器安装&#xff0c;与系统集成良好。对于开源项目开发&#xff0c;能方便地从源代码编译安装软件&#xff0c;使用构建工具&#xff0c;提供更原生的开发环境。 可高度定制系统&#xff0c;满足特殊开发需求…

【机器学习实战入门】使用OpenCV进行性别和年龄检测

Gender and Age Detection Python 项目 首先,向您介绍用于此高级 Python 项目的性别和年龄检测中的术语: 什么是计算机视觉? 计算机视觉是一门让计算机能够像人类一样观察和识别数字图像和视频的学科。它面临的挑战大多源于对生物视觉有限的了解。计算机视觉涉及获取、处…

左神算法基础提升--4

文章目录 树形dp问题Morris遍历 树形dp问题 求解这个问题需要用到我们在基础班上学到的从节点的左子树和右子树上拿信息的方法。 求最大距离主要分为两种情况&#xff1a;1.当前节点参与最大距离的求解&#xff1b;2.当前节点不参与最大距离的求解&#xff1b; 1.当前节点参与最…

spark任务优化参数整理

以下参数中有sql字眼的一般只有spark-sql模块生效&#xff0c;如果你看过spark的源码&#xff0c;你会发现sql模块是在core模块上硬生生干了一层&#xff0c;所以反过来spark-sql可以复用core模块的配置&#xff0c;例外的时候会另行说明&#xff0c;此外由于总结这些参数是在不…

华为数据中心CE系列交换机级联M-LAG配置示例

M-LAG组网简介 M-LAG&#xff08;Multi-chassis Link Aggregation&#xff09;技术是一种跨设备的链路聚合技术&#xff0c;它通过将两台交换机组成一个逻辑设备&#xff0c;实现链路的负载分担和故障切换&#xff0c;从而提高网络的可靠性和稳定性。下面给大家详细介绍如何在…

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

EMS专题 | 守护数据安全:数据中心和服务器机房环境温湿度监测

您需要服务器机房温度监测解决方案吗&#xff1f; 服务器机房是企业中用于存储、管理和维护服务器及其相关组件的设施。服务器机房通常位于数据中心内&#xff0c;是一个专门设计的物理环境&#xff0c;旨在确保服务器的稳定运行和数据的安全性。服务器机房主要起到存储和管理数…

4 AXI USER IP

前言 使用AXI Interface封装IP&#xff0c;并使用AXI Interface实现对IP内部寄存器进行读写实现控制LED的demo&#xff0c;这个demo是非常必要的&#xff0c;因为在前面的笔记中基本都需哟PS端与PL端就行通信互相交互&#xff0c;在PL端可以通过中断的形式来告知PS端一些事情&…

网络编程 | UDP套接字通信及编程实现经验教程

1、UDP基础 传输层主要应用的协议模型有两种&#xff0c;一种是TCP协议&#xff0c;另外一种则是UDP协议。在上一篇博客文章中&#xff0c;已经对TCP协议及如何编程实现进行了详细的梳理讲解&#xff0c;在本文中&#xff0c;主要讲解与TCP一样广泛使用了另一种协议&#xff1a…