尝试翻译下文档https://tip.golang.org/doc/go1.18
1.语言
范型
go1.18 实现了《类型参数提案》描述的范型特性,并且保持了对老版本的向下兼容
https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md
这些新的特性带来了大量源码的更新,但是这些代码尚未在生产环境进行过大规模的测试。这就需要更多的人使用范型来编写go代码。我们相信这一功能设计严谨、质量很高。但是不像go的其他方面的特性,我们不能保证大家的实践体验和我们预期的一样美好。因此,虽然我们鼓励大家在特定的场景下合理使用泛型,但在生产环境中部署泛型代码时还需要谨慎。
虽然我们相信这个新的语言功能设计得很好,并且定义明确,但我们也可能犯了错误。我们想重申《Go 1兼容性保证》
https://tip.golang.org/doc/go1compat中的规定:“如果有必要在规范中引入不一致或不完整的特性,解决掉所有可能会影响现有程序的语义或合法性的问题。我们保留发布这种issue的权利,包括更新和新功能实现。” 它还规定,“如果一个编译器或库有bug影响到了这个规范,即使我们修复了bug,依赖这种有bug行为的程序可能会崩溃。我们保留修复此类bug的权利。”翻译成人话,使用泛型的代码在1.18版本运行正常,但在以后的版本中可能会出bug,我们不计划做出此类变更。然而,由于我们今天无法预见的原因,在未来的版本中破坏1.18程序也是可能的。我们将尽可能减少此类破坏,但不能保证没有。
以下是最明显的变化列表。有关更全面的概述,请参见提案https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md。有关详细信息,请参见语言规范https://tip.golang.org/ref/spec
有三个使用泛型的实验包可能很有用。这些包位于x/exp目录中;他们的API不在Go 1规范范围内,随着我们在泛型方面获得更多经验,他们的API可能会发生变化。
golang.org/x/exp/constraints
泛型代码用到的常量,例如constraints.Ordered
.
golang.org/x/exp/slices
对任何元素类型的切片进行操作的泛型函数集合。
golang.org/x/exp/maps
对任何键或元素类型的map进行操作的通用函数集合。
当前版本的泛型实现有以下限制:
bug修复
在函数作用域中声明但从未使用过的变量, Go 1.18编译器现在可以正常报错。Go 1.18之前,在这种情况下编译器没有报错。这个长期悬而未决的编译器问题终于被修复了https://golang.org/issue/8560。由于这种变化,以前可能能够编译通过的程序现在会报错。修复很简单:如果程序确实有问题,不合法地使用了这种变量,可以将它赋值给_来解决这个问题。
Go 1.18编译器现在将rune量表达式(如'1'<<32)作为参数传递给预声明函数print和println时如果溢出能够正常检查出来,这与用户定义函数的预期的行为一致。在Go 1.18之前,编译器不会在这种情况下报告错误,但会在能够隐式转换成int64的情况下接受此类常量参数。由于这种变化,(可能不正确)程序可能无法编译通过。必要的修复很简单:如果程序实际上不正确,就修复它,或者显式地将有问题的参数转换为正确的类型。因为go vet能够扫描出此类错误,所以受影响的程序数量可能非常少。
2.接口
Go 1.18引入了新的GOAMD64环境变量,该变量在编译时选择AMD64体系结构的最低目标版本。允许的值为v1、v2、v3或v4。如果想使用高版本的特性,详细的描述可以在这里找到。
https://golang.org/wiki/MinimumRequirements#amd64
GOAMD64环境变量默认为v1。
RISC-V
Linux上的64位RISC-V体系结构(Linux/riscv64端口)现在支持c-archive和c-shared构建模式。
Linux
Go 1.18需要Linux内核版本2.6.32或更高版本。
windows
windows/arm和windows/arm64接口现在支持非协作式抢占,将该功能引入所有四个windows接口,有望解决在调用长时间阻塞的Win32函数时遇到的细微错误。
ios
在iOS(iOS/arm64端口)和基于AMD64的macOS(iOS/AMD64端口)上运行的iOS模拟器上,Go 1.18现在需要iOS 12或更高版本;对以前版本的支持已停止。
FreeBSD
Go 1.18不再支持最新版本FreeBSD 11.x。Go 1.19需要依赖FreeBSD 12.2+或FreeBSD 13.0+。FreeBSD 13.0+需要一个设置了COMPAT_FREEBSD12的内核选项(这是默认设置)。
3.工具
Go 1.18实现了模糊测试提案https://golang.org/issue/44551
详细可以参考模糊测试的介绍https://go.dev/doc/fuzz
需要注意的是模糊测试会消耗大量内存,并可能会影响机器运行时的性能。还要注意,模糊引擎在运行时会将扩展测试覆盖范围的数据写入$GOCACHE/fuzz缓存目录。目前,可能写入fuzz缓存的文件数或总字节数没有限制,因此它可能会占用大量存储空间(可能是几GB)。
Go command
go常用的命令有很多地方有更新,不一一详细翻译了。
go
get
go.mod
and go.sum
updatesgo
version
go
mod
download
go
mod
vendor
go
mod
tidy
go
work
go
build
-asan
go
test
//go:build
lines4.运行时
在特定的gc频率,垃圾收集器现在的工作包括了非堆源(例如堆栈扫描)的垃圾收集工作。因此,当这些源内存占用很大时,垃圾收集器的开销更容易预测。对于大多数应用来说,这些变化可以忽略不计;然而,一些Go应用程序现在可能比以前使用更少的内存,在垃圾收集上花费更多的时间,反之亦然。这个改动的目的是减少不必要的GOGC。
运行时现在可以更高效地将内存返回到操作系统,此调整将带来更高的运行效率。
Go 1.17修改了堆栈跟踪中参数的格式,但在打印寄存器中传递的参数值可能不准确。在Go 1.18中,会在每个可能不准确的值之后加上(?)。
当必须分配一个新的底层数组时,内置函数append现在在决定切片的增长量时使用了一个稍微不同的公式。新公式不太容易出现内存激增。
5.编译器
在指定的操作系统上,Go 1.17使用寄存器而不是64x86体系结构上的堆栈来传递函数参数和返回值。Go 1.18扩展了受支持的平台,在所有操作系统上包括64ARM(GOARCH=arm64)、大端和小端64PowerPC(GOARCH=ppc64、ppc64le)以及64x86体系结构(GOARCH=amd64)。在64ARM和64PowerPC系统上,基准测试显示了10%或更多的性能提升。
正如Go 1.17发行说明中提到的,此更改不会影响任何Go代码的功能,并且不会影响大多数汇编代码。有关更多详细信息,请参阅Go 1.17发行说明。https://tip.golang.org/doc/go1.17#compiler
编译器现在可以内联包含range循环或带label的for循环的函数。
new-asan编译器选项支持new go命令-asan选项。
由于编译器的类型检查器被完全替换以支持泛型,因此一些错误消息现在可能会使用与以前不同的措辞。在某些情况下,pre Go 1.18错误消息提供了更详细的信息,或者以更有用的方式表达。我们打算在Go 1.19中详细描述这些内容。
由于编译器中与支持泛型相关的更改,Go 1.18编译速度可能比Go 1.17编译速度慢大约15%。编译代码的执行时间不受影响。我们打算提高Go 1.19中编译器的速度。
6.连接器
链接器减少了重定位https://tailscale.com/blog/go-linker/。因此,大多数代码库将更快地链接,需要更少的内存来链接,并生成更小的二进制文件。处理Go二进制文件的工具应该使用Go 1.18的debug/gosym包来透明地处理新旧二进制文件。
new-asan链接器选项支持新的go命令-asan选项。
7.引导程序
从源代码构建Go版本时,如果未设置GOROOT_BOOTSTRAP 环境变量,则Go的早期版本会在目录HOME/go1(%HOMEDRIVE%%HOMEPATH%\go1.4 on Windows)中查找Go 1.4或更高版本的引导工具链。Go现在首先寻找HOME/go1.17或HOME/sdk/go1.17目录,失败后才回到HOME/go1.4.我们打算让Go 1.19要求Go 1.17或更高版本用于引导,这一更改应该会使过渡更加平滑。有关更多详细信息,请参阅https://go.dev/issue/44505
8.核心库
debug/buildinfo
packagenet/netip
packagebufio
bytes
crypto/elliptic
crypto/tls
crypto/x509
debug/dwarf
debug/elf
debug/plan9obj
go/ast
go/constant
go/token
go/types
html/template
image/draw
net
net/http
os/user
reflect
regexp
runtime/debug
runtime/pprof
strconv
strings
sync
syscall
syscall/js
testing
text/template
text/template/parse
unicode/utf8
本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!