它的大部分更改都在工具链、运行时和库的实现中。与往常一样,该版本保持了 Go 1的兼容性承诺。 新特性:
sync.map 支持并发读写,用法和map不同。 type alias 主要目的是用于已经定义的类型,在package之间的移动时的兼容问题。
最新的 Go 版本 1.18 版是一个重要版本,包括对语言(加入了期待已久的泛型)、工具链的实现、运行时和库的更改。和以往一样,该版本保持了 Go 1的兼容性承诺。 主要特性:
泛型 fuzzing(模糊测试),注意:模糊测试会消耗大量内存,并且可能会影响机器运行时的性能。另请注意,模糊引擎在运行时会将扩展测试覆盖率的值写入模糊缓存目录 $GOCACHE/fuzz。目前对可以写入模糊缓存的文件数量或总字节数没有限制,因此可能会占用大量存储空间(可能为数 GB)。 增加了go work命令,该go命令现在支持“工作区”模式。如果 go.work在工作目录或父目录中找到文件,或者使用GOWORK 环境变量指定文件,它将使go命令进入工作区模式。在工作区模式下,该go.work文件将用于确定用作模块解析根的主模块集,而不是使用通常找到的go.mod 文件来指定单个主模块。有关更多信息,请参阅 go work 文档。 基准测试显示典型的性能提升 10% 或更多。但由于与支持泛型相关的编译器的更改,Go 1.18 的编译速度可能比 Go 1.17 的编译速度慢大约 15%。
Go 1.17 包括对该语言的三个小改进。
从切片到数组指针的转换:s类型表达式[]T现在可以转换为数组指针类型 [N]T。如果a是此类转换的结果,则范围内的相应索引引用相同的基础元素:&a[i] == &s[i] for 0 <= i < N。如果len(s)小于,则转换会发生恐慌 N。 unsafe.Add: unsafe.Add(ptr, len)添加len 到ptr并返回更新指针 unsafe.Pointer(uintptr(ptr) + uintptr(len))。 unsafe.Slice: 对于ptrtype 的表达式T, unsafe.Slice(ptr, len)返回一个类型[]T的切片,其底层数组从 开始,ptr其长度和容量为len。 加入该软件包不安全增强简化编写代码符合unsafe.Pointer的安全规则,但规则保持不变。特别是,正确使用的现有程序unsafe.Pointer仍然有效,新程序在使用unsafe.Add或时仍必须遵循规则unsafe.Slice。 请注意,从切片到数组指针的新转换是类型转换在运行时可能发生混乱的第一种情况。假设类型转换永远不会恐慌的分析工具应该更新以考虑这种可能性。
语言没有变化。
包括对链接器的实质性改进,改进了高核心数下小对象的分配,并弃用了X.509 CommonName。 GOPROXY现在支持跳过返回错误的代理,并添加了新的嵌入式 tzdata 包。
Go Module已经具备生产环境中使用条件了,我们鼓励所有用户迁移到Go Module进行依赖项管理。 根据重叠接口建议,Go 1.14 现在允许嵌入具有重叠方法集的接口:来自嵌入式接口的方法可能具有与(嵌入)接口中已有的方法相同的名称和相同的签名。这解决了菱形的嵌入图通常(但不是完全)发生的问题。接口中显式声明的方法必须像以前一样保持唯一。 defer性能提升 goroutine 支持异步抢占 time.Timer定时器性能得到“巨幅”提升 Go 1.14 test 优化等 Go 1.13 新特性 详细 Go 1.13将对语法和标准库做出的增强。
从Go SDK 1.13开始,标准编译器将采用一个新的逃逸分析器,从而将避免很了多不必要的在堆上开辟内存的情况。
Go SDK 1.13开始,满足某些条件的某些defer延迟调用(标准库中93%的延迟调用满足此条件)将被记录在栈上而不是堆上,从而提高了defer延迟调用的执行效率。
官方Go runtime 1.13将对sync.Pool中的对象回收时机策略做出调整。在1.12版本及以前的版本中,在每轮垃圾回收过程中,每个sync.Pool实例中的所有缓存对象都将被无条件回收掉。从1.13版本开始,如果一个sync.Pool实例在上一轮垃圾回收过程结束之后仍然被使用过,则其中的缓存对象将不会被回收掉。此举对于使用sync.Pool来提升效率的程序来说,将大大减少周期性的因为缓存被清除而造成的瞬时效率下降。
从Go SDK 1.13开始,编译输出的二进制可执行文件中将包含所用Go编译器的版本和此执行文件所依赖的各种第三方库包的版本号。我们可以使用命令go version binaryfile来查看一个二进制可执行文件是使用哪个版本的编译器编译的,或者使用命令go version -m binaryfile来查看包含在一个二进制可执行文件中的各个第三方依赖库包的版本号。
Go modules版本依赖管理特性将从Go SDK 1.13开始大规模推荐使用。模块模式将成为默认模式。GOPATH环境变量的地位将减弱甚至丧失。GOBIN环境变量的地位将提升,因为go install命令仍需要一个路径来存储生成的二进制可执行文件。另外,伴随Go modules而生的GOPROXY环境变量的设置格式得到了增强。我们可以使用下面的格式来指定多个代理:
GOPROXY=proxy1,proxy2,proxy3 go命令在需要下载库包的时候将逐个试用设置中的各个代理,直到发现一个可用的为止。特别地,direct表示直连。一个设置例子:
GOPROXY=direct,https://proxy.golang.org,https://myproxy.mysite:8888 GOPROXY环境变量可以帮助我们下载墙外的第三方库包。当然,通过设置https_proxy环境变量设也可以达到此目的。但是一个公司通过在内部架设一个自己的goproxy服务器来缓存第三方库包,库包下载速度可能会更快。为了防止出现node.js社区中大量的在使用npm时造成的不经意间引入木马库包的情况,Go官方推出了Go checksum database(sumdb):https://sum.golang.org。go命令将在必要的时候连接此服务来检查下载的第三方依赖包的哈希是否和sumdb的记录相匹配。有些遗憾,和proxy.golang.org类似,sum.golang.org也被墙了。但是我们同样可以设置https_proxy代理或者架设自己的sumdb服务器来解决这个问题。GOSUMDB环境变量用来设置第三方sum database服务器地址,其默认值为https://sum.golang.org。我们可以将其值设为off来关闭哈希检查,go命令的选项-insecure发挥同样的作用。当然,为了安全起见,一般情况下最好不要关闭哈希检查。在设置了GOPROXY环境变量的情况下,我们可以设置GONOPROXY环境变量来设置不需要通过goproxy服务器来下载的库包。在设置了GOSUMDB环境变量的情况下,我们可以设置GONOSUMDB环境变量来设置不需要哈希检查的库包。
提升了大量堆(Heap)活跃状态情况下的清理性能,这减少了垃圾回收之后的分配延迟,可以更好地将内存释放回操作系统;Runtime 的 timer 和 deadline 代码随着 CPU 数目的增加,会有更好的表现。这提升了网络连接最后期限(deadline)相关操作的性能;对大型堆分配的相关修复,提升了内存配置文件的精确性; Go 1.12 在 RFC 8446 指定的crypto/tls包中添加了对 TLS 1.3 的选择支持。可以通过将值 tls13 = 1 添加到 GODEBUG 环境变量来启用它。 它将在 Go 1.13 中默认启用。 正式官方的包依赖管理工具(go modules),在Go 1.12进一步完善。
最新的Go版本1.11版本在Go 1.10之后六个月到达。它的大部分变化都在于工具链,运行时和库的实现。与往常一样,该版本保持了Go 1 的兼容性承诺。我们希望几乎所有的Go程序都能像以前一样继续编译和运行。
最新的Go版本1.10版本在Go 1.9发布六个月后推出。它的大部分变化都在于工具链,运行时和库的实现。与往常一样,该版本保持了Go 1 的兼容性承诺。我们希望几乎所有的Go程序都能像以前一样继续编译和运行。
此版本改进了构建的包的缓存;
添加了成功测试结果的缓存,在测试期间自动运行vet,并允许使用cgo直接在Go和C之间传递字符串值。
新的编译器选项白名单可能会invalid flag在使用旧版本成功构建的代码中导致意外错误。
最新的Go版本1.9,在Go 1.8发布六个月后推出,是Go 1.x系列的第十个版本。该语言有两处更改:添加对类型别名的支持,以及定义实现何时融合浮点运算。大多数更改都在工具链,运行时和库的实现中。与往常一样,该版本保持了Go 1 的兼容性承诺。我们希望几乎所有的Go程序都能像以前一样继续编译和运行。
该版本增加了透明的单调时间支持; 并行化了包中的函数编译; 更好地支持测试助手函数,包括一个新的位操作包,并具有新的并发映射类型。
最新的Go版本1.8版本在Go 1.7发布六个月后推出。它的大部分变化都在于工具链,运行时和库的实现。语言规范有两个小的变化。与往常一样,该版本保持了Go 1 的兼容性承诺。我们希望几乎所有的Go程序都能像以前一样继续编译和运行。
该版本增加了对32位MIPS的支持; 更新编译器后端以生成更高效的代码; 通过消除世界各地的堆栈重新扫描减少GC暂停; 添加HTTP / 2推送支持, 添加HTTP正常关闭; 添加更多上下文支持; 支持分析互斥体,并简化排序切片。
最新的Go版本1.7,在1.6之后的六个月到来。它的大部分变化都在于工具链,运行时和库的实现。语言规范有一个小的改动。与往常一样,该版本保持了Go 1 的兼容性承诺。我们希望几乎所有的Go程序都能像以前一样继续编译和运行。
该版本为IBM LinuxOne添加了一个端口 ; 更新x86-64编译器后端以生成更高效的代码; 包括从 x / net子存储 库中提升并现在在标准库中使用的上下文包 ; 并在测试包中添加了对创建测试和基准测试层次结构的支持。该版本还完成了 Go 1.5中开始的销售支持,使其成为标准功能。
Go 1.6 发布了,该版本在语言本身层面并没有任何变化,主要改进包括:
默认使用 cgo 外部 C 编译器 支持 HTTP/2 协议 增加对 64 位 MIPS 的体验支持 (Linux) 增加对 32 位 x86 上的 Android 的体验支持 在 FreeBSD 上 go 1.6 默认使用 clang 而不是 gcc 作为外部 C 编译器
最新的Go版本1.5版是一个重要版本,包括对实现的主要体系结构更改。尽管如此,我们希望几乎所有Go程序都能像以前一样继续编译和运行,因为该版本仍然保持Go 1 承诺的兼容性。
实施的最大进展是:
编译器和运行时现在完全用Go编写(带有一点汇编程序)。C不再参与实现,因此曾经构建分发所必需的C编译器消失了。 垃圾收集器现在是并发的,并且在可能的情况下与其他goroutine并行运行,从而显着降低了暂停时间。 默认情况下,Go程序运行时GOMAXPROCS设置为可用的核心数; 在之前的版本中它默认为1。 现在为所有存储库提供了 对内部包的支持,而不仅仅是Go核心。 该go命令现在为“销售”外部依赖项提供实验支持。 新go tool trace命令支持细粒度的程序执行跟踪。 为命令行使用自定义 新go doc命令(不同于godoc)。 该版本还包含一个涉及地图文字的小语言更改。 发布历史
本文作者:Kevin
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!