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 包含的变更

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#,入门教程(02)—— Visual Studio 2022开发环境搭建图文教程

如果这是您阅读的本专栏的第一篇博文&#xff0c;建议先阅读如何安装Visual Studio 2022。 C#&#xff0c;入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程https://blog.csdn.net/beijinghorn/article/details/123350910 一、简单准备 开始学习、编写程序…

数字艺术类专业人才供需数据获取和分析研究

本文章所用数据集&#xff1a;数据集 本文章所用源代码&#xff1a;源代码和训练好的模型 第1章 绪论 1.1研究背景及意义 随着社会经济的迅速发展和科技的飞速进步&#xff0c;数字艺术类专业正逐渐崛起&#xff0c;并呈现出蓬勃发展的势头。数字艺术作为创作、设计和表现形式的…

imbinarize函数用法详解与示例

一、函数概述 众所周知&#xff0c;im2bw函数可以将灰度图像转换为二值图像。但MATLAB中还有一个imbinarize函数可以将灰度图像转换为二值图像。imbinarize函数是MATLAB图像处理工具箱中用于将灰度图像或体数据二值化的工具。它可以通过全局或自适应阈值方法将灰度图像转换为二…

使用ffmpeg提高mp4压缩比,减小文件体积【windows+ffmpeg+batch脚本】

文章目录 关于前情提要FFmpeg是什么使用脚本运行FFmpeg首先&#xff0c;下载ffmpeg.exe然后在视频相同位置写一个bat脚本运行压缩脚本 关于 个人博客&#xff0c;里面偶尔更新&#xff0c;最近比较忙。发一些总结的帖子和思考。 江湖有缘相见&#x1f91d;。如果读者想和我交…

Codeforces Round 997 (Div. 2) A~C

今天的封面是水母猫猫和佩佩&#xff0c;原图在这里&#xff0c;记得关注画师夏狩大大 至此&#xff0c;天鹅完成了连续四场比赛在四个不同比赛上四次分的壮举&#xff01;&#xff08;ABC388&#xff0c;CodeChef169&#xff0c;牛客月赛109&#xff0c;CF997&#xff09; 这场…

JavaFx + SpringBoot 快速开始脚手架

JavaFX系列项目模板 JDK8 & JavaFX & SpringBoot 加持SpringBoot&#xff0c;项目示例&#xff0c;Maven打包插件带可执行程序JDK8 & JavaFX 不依赖SpringBoot&#xff0c;项目示例&#xff0c;Maven打包插件带可执行程序JDK11 & JavaFX15 使用 jlink 打包为精…

蓝桥杯3525 公因数匹配 | 枚举+数学

题目传送门 这个题目是一个数学题&#xff0c;由于只需要找到存在大于1的公因数的两数&#xff0c;所以比较方便的做法是统计每一个数的&#xff08;质&#xff09;因数。可以通过筛法统计质因数降低复杂度&#xff0c;但是直接枚举因数也可以满足要求。使用字典记录每个因数出…

当PHP遇上区块链:一场奇妙的技术之旅

PHP 与区块链的邂逅 在技术的广袤宇宙中&#xff0c;区块链技术如同一颗耀眼的新星&#xff0c;以其去中心化、不可篡改、透明等特性&#xff0c;掀起了一场席卷全球的变革浪潮。众多开发者怀揣着对新技术的热忱与探索精神&#xff0c;纷纷投身于区块链开发的领域&#xff0c;试…

利用Ai,帮我完善了UsbCamera App的几个界面和设置功能

早些时候&#xff0c;我有开源了一个UsbCamera App的代码&#xff0c;后来因为一些原因&#xff0c;就只针对星球成员和课程视频成员开源了。最近&#xff0c;我对这个App进行了一些内容的补充。 主要是添加了一些设置相关的内容&#xff0c;支持rtmp推流、循环录像、镜像&…

【系统分享01】Python+Vue电影推荐系统

大家好&#xff0c;作为一名老程序员&#xff0c;今天我将带你一起走进电影推荐系统的世界&#xff0c;分享如何利用 Django REST Framework 和 Vue 搭建一套完整的电影推荐系统&#xff0c;结合 协同过滤算法&#xff0c;根据用户评分与影片喜好&#xff0c;精准推送用户可能喜…

【k8s面试题2025】1、练气期

主要通过呼吸吐纳等方法&#xff0c;将外界的天地灵气吸入体内&#xff0c;初步改造身体&#xff0c;使身体素质远超常人。 文章目录 docker 和虚拟机的不同Kubernetes 和 docker 的关系Kube-proxy IPVS 和 iptables 的异同蓝绿发布Kubernetes中常见的数据持久化方式关于 Docke…

【统计的思想】假设检验(一)

假设检验是统计学里的重要方法&#xff0c;同时也是一种“在理想与现实之间观察求索”的测试活动。假设检验从概率的角度去考察理想与现实之间的关系&#xff0c;籍此来缓解测试可信性问题。 我们先来看一个例子。民航旅客服务系统&#xff0c;简称PSS系统&#xff0c;有一种业…

Ubuntu 24.04 LTS 通过 docker desktop 安装 seafile 搭建个人网盘

准备 Ubuntu 24.04 LTSUbuntu 空闲硬盘挂载Ubuntu 安装 Docker Desktop [我的Ubuntu服务器折腾集](https://blog.csdn.net/jh1513/article/details/145222679。 安装 seafile 参考资料 Docker安装 Seafile OnlyOffice 并配置OnlyOffice到Seafile&#xff0c;实现在线编辑…

移远通信多模卫星通信模组BG95-S5获得Skylo网络认证,进一步拓展全球卫星物联网市场

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信正式宣布&#xff0c;其支持“卫星蜂窝”多模式的高集成度NTN卫星通信模组BG95-S5已成功获得NTN网络运营商Skylo的网络认证。BG95-S5也成为了获得该认证的最新款移远卫星通信模组。 BG95-S5模组顺利获得Skylo认证&a…

使用SIPP发起媒体流性能测试详解

使用SIPP发起媒体流性能测试详解 一、SIPP工具简介二、测试前的准备三、编写测试脚本四、运行测试五、分析测试结果六、总结SIPP(SIP Performance Protocol)是一个开源工具,专门用于SIP(Session Initiation Protocol)协议的性能测试和基准测试。SIP是一种用于控制多媒体通…

农业农村大数据应用场景|珈和科技“数字乡村一张图”解决方案

近年来&#xff0c;珈和科技持续深耕农业领域&#xff0c;聚焦时空数据服务智慧农业。 珈和利用遥感大数据、云计算、移动互联网、物联网、人工智能等先进技术&#xff0c;搭建“天空地一体化”监测体系&#xff0c;并创新建设了150的全球领先算法模型&#xff0c;广泛应用于高…

HTML学习笔记(4)

目录 一、背景相关样式 二、定位position 三、javascript 1、变量的定义 2、数据类型 3、绑定事件 一、背景相关样式 background-image: url(); // 背景图片 background-repeat: repeat; // 背景图片是否平铺 no-repeat background-size: 200px; // 背景图片尺寸 cover把…

【神经网络基础】

目录 一、神经网络的构成 1.1什么是神经网络&#xff1f; 1.2 激活函数 1.2.1 Sigmoid 1.2.2 Tanh 1.2.3 ReLU 1.2.4 softmax 1.2.5 其他激活函数 1.2.6 选择激活函数 1.3 参数初始化 1.4 模型构建 二、损失函数 2.1 分类问题 2.1.1多分类&#xff08;多分类交叉…

创建一个简单的spring boot+vue前后端分离项目

一、环境准备 此次实验需要的环境&#xff1a; jdk、maven、nvm和node.js 开发工具&#xff1a;idea或者Spring Tool Suite 4&#xff0c;前端可使用HBuilder X&#xff0c;数据库Mysql 下面提供maven安装与配置步骤和nvm安装与配置步骤&#xff1a; 1、maven安装与配置 1…

Spring Security 6.X + JWT + RBAC 权限管理实战教程(上)

前言 本教程基于 Spring Boot 3.x Spring Security 6.x 实现&#xff0c;采用 JWT Redis 的认证方案&#xff0c;结合 RBAC 权限模型&#xff0c;实现了一个完整的权限管理系统。 一、项目依赖配置 关键依赖说明&#xff1a; <!-- SpringWeb --><dependency><…