Go 1.16 版本说明
Go 1.16 简介
最新的 Go 版本 1.16 在 Go 1.15 发布六个月后发布。其大部分变化在工具链、运行时和库的实现中。与往常一样,该版本保持了 Go 1 兼容性承诺。我们预计几乎所有 Go 程序都将继续像以前一样编译和运行。
语言变更
语言没有任何变更。
移植
Darwin 和 iOS
Go 1.16 添加了对 macOS 上 64 位 ARM 架构的支持(也称为 Apple Silicon),GOOS=darwin
,GOARCH=arm64
。与 darwin/amd64
移植一样,darwin/arm64
移植支持 cgo、内部和外部链接、c-archive
、c-shared
和 pie
构建模式以及竞态检测器。
以前为 darwin/arm64
的 iOS 移植已重命名为 ios/arm64
。GOOS=ios
意味着 darwin
构建标签,就像 GOOS=android
意味着 linux
构建标签一样。此更改对于使用 gomobile 构建 iOS 应用程序的人来说应该是透明的。
引入 GOOS=ios
意味着像 x_ios.go
这样的文件名现在只会在 GOOS=ios
下构建;有关详细信息,请参阅 go
help
buildconstraint
。使用这种形式的文件名的现有包将不得不重命名这些文件。
Go 1.16 添加了 ios/amd64
移植,它以在基于 AMD64 的 macOS 上运行的 iOS 模拟器为目标。以前,这通过在设置 ios
构建标签的情况下使用 darwin/amd64
获得非官方支持。有关如何为 iOS 和 iOS 模拟器构建程序的详细信息,另请参阅 misc/ios/README
。
Go 1.16 是最后一个支持 macOS 10.12 Sierra 的版本。Go 1.17 将需要 macOS 10.13 High Sierra 或更高版本。
NetBSD
Go 现在支持 NetBSD 上的 64 位 ARM 架构(netbsd/arm64
移植)。
OpenBSD
Go 现在支持 OpenBSD 上的 MIPS64 架构(openbsd/mips64
移植)。此移植尚不支持 cgo。
在 OpenBSD 上的 64 位 x86 和 64 位 ARM 架构上(openbsd/amd64
和 openbsd/arm64
移植),系统调用现在通过 libc
进行,而不是直接使用 SYSCALL
/SVC
指令。这确保了与 OpenBSD 未来版本的向前兼容性。特别是,OpenBSD 6.9 及更高版本将要求通过 libc
进行系统调用,以供非静态 Go 二进制文件使用。
386
如 Go 1.15 版本说明中 宣布,Go 1.16 弃用对 x87 模式编译的支持(GO386=387
)。现在可以使用软浮点模式(GO386=softfloat
)支持非 SSE2 处理器。在非 SSE2 处理器上运行的用户应将 GO386=387
替换为 GO386=softfloat
。
RISC-V
linux/riscv64
移植现在支持 cgo 和 -buildmode=pie
。此版本还包括针对 RISC-V 的性能优化和代码生成改进。
工具
Go 命令
模块
无论当前工作目录或父目录中是否存在 go.mod
文件,模块感知模式都默认启用。更准确地说,GO111MODULE
环境变量现在默认设置为 on
。要切换到之前的行为,请将 GO111MODULE
设置为 auto
。
go
build
和 go
test
等构建命令不再默认修改 go.mod
和 go.sum
。相反,如果需要添加或更新模块要求或校验和,它们会报告错误(就像使用了 -mod=readonly
标志一样)。可以使用 go
mod
tidy
或 go
get
来调整模块要求和校验和。
go
install
现在接受带有版本后缀的参数(例如,go
install
example.com/[email protected]
)。这会导致 go
install
以模块感知模式构建和安装包,忽略当前目录或任何父目录中的 go.mod
文件(如果有)。这对于在不影响主模块依赖项的情况下安装可执行文件很有用。
go
install
(带或不带版本后缀,如上所述)现在是模块模式下构建和安装包的推荐方法。go
get
应与 -d
标志一起使用来调整当前模块的依赖项,而不构建包,并且使用 go
get
构建和安装包已弃用。在将来的版本中,-d
标志将始终启用。
retract
指令现在可以在 go.mod
文件中使用,以指示其他模块不应使用模块的某些已发布版本。模块作者可以在发现严重问题或意外发布版本后撤回版本。
go
mod
vendor
和 go
mod
tidy
子命令现在接受 -e
标志,它指示它们在解析缺少的包时继续执行,即使存在错误。
go
命令现在忽略主模块中 exclude
指令排除的模块版本的依赖项。以前,go
命令使用高于排除版本的下一个版本,但该版本可能会随着时间的推移而改变,导致构建不可重现。
在模块模式下,go
命令现在不允许包含非 ASCII 字符或路径元素以点字符(.
)开头的导入路径。包含这些字符的模块路径已不再允许(请参阅 模块路径和版本),因此此更改仅影响模块子目录中的路径。
嵌入文件
go
命令现在支持使用新的 //go:embed
指令将静态文件和文件树包含为最终可执行文件的一部分。有关详细信息,请参阅新 embed
包的文档。
go
test
在使用 go
test
时,在测试函数执行期间调用 os.Exit(0)
的测试现在将被视为失败。这将有助于发现测试调用调用 os.Exit(0)
并因此停止运行所有未来测试的代码的情况。如果 TestMain
函数调用 os.Exit(0)
,那仍然被视为通过的测试。
当 -c
或 -i
标志与未知标志一起使用时,go
test
会报告错误。通常,未知标志会传递给测试,但当使用 -c
或 -i
时,不会运行测试。
go
get
go
get
-insecure
标志已弃用,将在未来的版本中删除。此标志允许从存储库中获取并使用不安全的方案(例如 HTTP)解析自定义域,并且还会绕过使用校验和数据库的模块校验和验证。要允许使用不安全的方案,请改用 GOINSECURE
环境变量。要绕过模块校验和验证,请使用 GOPRIVATE
或 GONOSUMDB
。有关详细信息,请参阅 go
help
environment
。
go
get
example.com/mod@patch
现在要求主模块已要求 example.com/mod
的某些版本。(但是,go
get
-u=patch
仍然会修补新添加的依赖项。)
GOVCS
环境变量
GOVCS
是一个新的环境变量,它限制了 go
命令可以使用哪些版本控制工具来下载源代码。这减轻了通常在受信任的经过身份验证的环境中使用的工具的安全问题。默认情况下,可以使用 git
和 hg
从任何存储库下载代码。svn
、bzr
和 fossil
只能用于从模块路径或包路径与 GOPRIVATE
环境变量中的模式匹配的存储库下载代码。有关详细信息,请参阅 go
help
vcs
。
all
模式
当主模块的 go.mod
文件声明 go
1.16
或更高版本时,all
包模式现在仅匹配主模块中找到的包或测试所传递导入的那些包。(由测试导入主模块的包的包导入的包不再包含在内。)这是自 Go 1.11 以来 go
mod
vendor
保留的相同一组包。
-toolexec
构建标志
当指定 -toolexec
构建标志来使用程序在调用工具链程序(如编译或汇编)时,环境变量 TOOLEXEC_IMPORTPATH
现在被设置为正在构建的包的导入路径。
-i
构建标志
go
build
、go
install
和 go
test
接受的 -i
标志现在已弃用。-i
标志指示 go
命令安装命令行上命名的包导入的包。由于构建缓存是在 Go 1.10 中引入的,因此 -i
标志不再对构建时间有重大影响,并且当安装目录不可写时会导致错误。
list
命令
当指定 -export
标志时,BuildID
字段现在被设置为已编译包的构建 ID。这等效于在 go
list
-exported
-f
{{.Export}}
上运行 go
tool
buildid
,但无需额外的步骤。
-overlay
标志
-overlay
标志指定一个 JSON 配置文件,其中包含一组文件路径替换。-overlay
标志可与所有构建命令和 go
mod
子命令一起使用。它主要用于编辑工具(如 gopls)来了解对源文件的未保存更改的影响。配置文件将实际文件路径映射到替换文件路径,go
命令及其构建将像实际文件路径存在一样运行,其内容由替换文件路径给出,或者如果替换文件路径为空则不存在。
Cgo
即使它们的大小可以在 Go 中表示,cgo 工具也不会再尝试将 C 结构体位字段转换为 Go 结构体字段。C 位字段在内存中的出现顺序取决于实现,因此在某些情况下,cgo 工具会生成实际上不正确的结果。
Vet
针对 goroutine 中无效的 testing.T 使用的新警告
vet 工具现在会警告在测试期间创建的 goroutine 中对 testing.T
方法 Fatal
的无效调用。这也会警告对 testing.T
测试或 testing.B
基准测试的 Fatalf
、FailNow
和 Skip{,f,Now}
方法的调用。
调用这些方法会停止创建的 goroutine 的执行,而不是 Test*
或 Benchmark*
函数的执行。因此,这些方法 需要 由运行测试或基准测试函数的 goroutine 调用。例如
func TestFoo(t *testing.T) {
go func() {
if condition() {
t.Fatal("oops") // This exits the inner func instead of TestFoo.
}
...
}()
}
从创建的 goroutine 调用 t.Fatal
(或类似方法)的代码应重写为使用 t.Error
信号测试失败,并使用其他方法(例如使用 return
语句)提前退出 goroutine。前面的示例可以重写为
func TestFoo(t *testing.T) {
go func() {
if condition() {
t.Error("oops")
return
}
...
}()
}
帧指针的新警告
vet 工具现在会警告关于 amd64 汇编代码违反调用约定,在不保存和恢复的情况下覆盖 BP 寄存器(帧指针)。不保留 BP 寄存器的代码必须修改为要么根本不使用 BP,要么通过保存和恢复来保留 BP。保留 BP 的一种简单方法是将帧大小设置为非零值,这将导致生成的序言和结语为您保留 BP 寄存器。有关示例修复,请参阅 CL 248260。
asn1.Unmarshal 的新警告
vet 工具现在会警告错误地将非指针或空参数传递给 asn1.Unmarshal
。这类似于对 encoding/json.Unmarshal
和 encoding/xml.Unmarshal
的现有检查。
运行时
新的 runtime/metrics
包引入了从 Go 运行时读取实现定义的指标的稳定接口。它取代了现有的函数,例如 runtime.ReadMemStats
和 debug.GCStats
,并且更通用且效率更高。有关更多详细信息,请参阅包文档。
将 GODEBUG
环境变量设置为 inittrace=1
现在会导致运行时为每个包 init
向标准错误输出一行,总结其执行时间和内存分配。此跟踪可用于查找 Go 启动性能的瓶颈或回归。GODEBUG
文档 描述了格式。
在 Linux 上,运行时现在默认情况下会立即将内存释放到操作系统(使用 MADV_DONTNEED
),而不是在操作系统处于内存压力下时延迟释放(使用 MADV_FREE
)。这意味着进程级内存统计信息(如 RSS)将更准确地反映 Go 进程使用的物理内存量。目前正在使用 GODEBUG=madvdontneed=1
来改善内存监控行为的系统不再需要设置此环境变量。
Go 1.16 修复了竞态检测器与 Go 内存模型 之间的差异。竞态检测器现在更精确地遵循内存模型的通道同步规则。因此,检测器现在可能会报告以前错过的竞态。
编译器
编译器现在可以内联带有非标签 for
循环、方法值和类型切换的函数。内联器还可以检测更多间接调用,在这些调用中可以进行内联。
链接器
此版本包含对 Go 链接器的更多改进,减少了链接器资源使用(时间和内存)并提高了代码健壮性和可维护性。这些更改构成了 对 Go 链接器进行现代化 的两阶段项目的后半部分。
1.16 中的链接器更改将 1.15 的改进扩展到所有支持的架构/操作系统组合(1.15 的性能改进主要针对基于 ELF
的操作系统和 amd64
架构)。对于一组有代表性的大型 Go 程序,链接速度比 1.15 快 20-25%,对于 linux/amd64
平均需要少 5-15% 的内存,其他架构和操作系统有更大的改进。由于更积极的符号修剪,大多数二进制文件也更小。
在 Windows 上,go build -buildmode=c-shared
现在默认情况下会生成 Windows ASLR DLL。可以使用 --ldflags=-aslr=false
禁用 ASLR。
标准库
嵌入文件
新的 embed
包提供了对使用新的 //go:embed
指令 在编译期间嵌入到程序中的文件的访问权限。
文件系统
新的 io/fs
包定义了 fs.FS
接口,这是一个用于只读文件树的抽象。标准库包已针对适当的接口进行了调整。
在接口的生产者端,新的 embed.FS
类型实现了 fs.FS
,zip.Reader
也是如此。新的 os.DirFS
函数提供了一个由操作系统文件树支持的 fs.FS
实现。
在消费者端,新的 http.FS
函数将 fs.FS
转换为 http.FileSystem
。此外,html/template
和 text/template
包的 ParseFS
函数和方法从 fs.FS
中读取模板。
为了测试实现 fs.FS
的代码,新的 testing/fstest
包提供了一个 TestFS
函数,该函数会检查并报告常见错误。它还提供了一个简单的内存中文件系统实现,MapFS
,这对于测试接受 fs.FS
实现的代码很有用。
io/ioutil 的弃用
io/ioutil
包已被证明是一个定义不明确且难以理解的事物集合。包提供的全部功能已移至其他包。io/ioutil
包仍然存在并将继续像以前一样工作,但我们鼓励新的代码使用 io
和 os
包中的新定义。以下列出了 io/ioutil
导出的名称的新位置
Discard
=>io.Discard
NopCloser
=>io.NopCloser
ReadAll
=>io.ReadAll
ReadDir
=>os.ReadDir
(注意:返回os.DirEntry
的切片,而不是fs.FileInfo
的切片)ReadFile
=>os.ReadFile
TempDir
=>os.MkdirTemp
TempFile
=>os.CreateTemp
WriteFile
=>os.WriteFile
库的次要更改
与往常一样,库中存在各种次要更改和更新,这些更改和更新是考虑到 Go 1 的 兼容性承诺。
archive/zip
新的 Reader.Open
方法实现了 fs.FS
接口。
crypto/dsa
crypto/dsa
包现在已弃用。请参阅 问题 #40337。
crypto/hmac
New
现在如果对哈希生成函数的单独调用无法返回新值,则会抛出异常。以前,行为是未定义的,并且有时会生成无效的输出。
crypto/tls
现在可以使用新的 net.ErrClosed
错误检测关闭或已关闭的 TLS 连接上的 I/O 操作。典型用法是 errors.Is(err, net.ErrClosed)
。
现在在 Conn.Close
中设置默认写入截止日期,然后再发送“关闭通知”警报,以防止无限期阻塞。
如果服务器选择了 ALPN 协议,该协议不在 客户端广告的列表 中,客户端现在会返回握手错误。
如果客户端或服务器都没有 AES 硬件支持,服务器现在会优先选择其他可用的 AEAD 密码套件(例如 ChaCha20Poly1305),而不是 AES-GCM 密码套件,除非 Config.PreferServerCipherSuites
和 Config.CipherSuites
都已设置。如果客户端没有信号表明对 AES-GCM 密码套件的偏好,则假定它没有 AES 硬件支持。
Config.Clone
现在如果接收方为 nil,则返回 nil,而不是抛出异常。
crypto/x509
GODEBUG=x509ignoreCN=0
标志将在 Go 1.17 中删除。它启用将 X.509 证书上的 CommonName
字段视为主机名的传统行为,前提是没有主题备用名称。
ParseCertificate
和 CreateCertificate
现在对 DNSNames
、EmailAddresses
和 URIs
字段强制执行字符串编码限制。这些字段只能包含 ASCII 范围内的字符的字符串。
CreateCertificate
现在使用签名者的公钥验证生成的证书的签名。如果签名无效,则返回错误,而不是错误格式的证书。
不再支持 DSA 签名验证。请注意,DSA 签名生成从未得到支持。请参阅 问题 #40337。
在 Windows 上,Certificate.Verify
现在将返回平台证书验证程序构建的所有证书链,而不仅仅是排名最高的链。
新的 SystemRootsError.Unwrap
方法允许通过 errors
包函数访问 Err
字段。
在类 Unix 系统上,crypto/x509
包现在在存储其系统证书池副本的方式上更高效。仅使用少量根的程序将使用大约少一半兆字节的内存。
debug/elf
encoding/asn1
Unmarshal
和 UnmarshalWithParams
现在在参数不是指针或为空时返回错误,而不是抛出异常。此更改与其他编码包(如 encoding/json
)的行为相匹配。
encoding/json
Marshal
、Unmarshal
和相关功能理解的 json
结构体字段标签现在允许在 Go 结构体字段的 JSON 对象名称中使用分号字符。
encoding/xml
编码器一直小心避免使用以 xml
开头的命名空间前缀,这些前缀由 XML 规范保留。现在,更严格地遵循规范,该检查不区分大小写,因此以 XML
、XmL
等开头的前缀也会被避免。
flag
新的 Func
函数允许注册通过调用函数来实现的标志,作为实现 Value
接口的更轻量级替代方案。
go/build
Package
结构体新增了一些字段,用于报告包中 //go:embed
指令的信息:EmbedPatterns
、EmbedPatternPos
、TestEmbedPatterns
、TestEmbedPatternPos
、XTestEmbedPatterns
、XTestEmbedPatternPos
。
Package
字段 IgnoredGoFiles
将不再包含以“_”或“.”开头的文件,因为这些文件始终会被忽略。IgnoredGoFiles
用于存储由于构建约束而被忽略的文件。
新 Package
字段 IgnoredOtherFiles
包含了由于构建约束而被忽略的非 Go 文件列表。
go/build/constraint
新的 go/build/constraint
包解析构建约束行,包括原始的 // +build
语法和将在 Go 1.17 中引入的 //go:build
语法。该包的存在是为了使使用 Go 1.16 构建的工具能够处理 Go 1.17 源代码。有关构建约束语法的详细信息以及计划向 //go:build
语法过渡的信息,请参见 https://golang.ac.cn/design/draft-gobuild。请注意,在 Go 1.16 中不支持 //go:build
行,也不应该将其引入 Go 程序中。
html/template
新的 template.ParseFS
函数和 template.Template.ParseFS
方法类似于 template.ParseGlob
和 template.Template.ParseGlob
,但它们从 fs.FS
中读取模板。
io
该包现在定义了一个 ReadSeekCloser
接口。
该包现在定义了 Discard
、NopCloser
和 ReadAll
,它们将用于替代 io/ioutil
包中的同名函数。
log
新的 Default
函数提供了对默认 Logger
的访问。
log/syslog
Writer
现在在记录到自定义 Unix 域套接字时使用本地消息格式(省略主机名并使用更短的时间戳),与默认日志套接字中使用的格式一致。
mime/multipart
Reader
的 ReadForm
方法不再在将最大 int64 值作为限制传递时拒绝表单数据。
net
现在可以使用新的 ErrClosed
错误来检测关闭的网络连接上的 I/O 或在任何 I/O 完成之前关闭的网络连接上的 I/O。典型的用法是 errors.Is(err, net.ErrClosed)
。在之前的版本中,唯一可靠地检测这种情况的方法是将 Error
方法返回的字符串与 "use of closed network connection"
进行匹配。
在之前的 Go 版本中,Linux 系统上的默认 TCP 监听器积压大小(由 /proc/sys/net/core/somaxconn
设置)被限制为最大 65535
。在 Linux 内核版本 4.1 及更高版本上,最大值为 4294967295
。
在 Linux 上,当 /etc/nsswitch.conf
丢失时,主机名查找不再在检查 /etc/hosts
之前使用 DNS;这在基于 musl 的系统上很常见,并使 Go 程序的行为与这些系统上的 C 程序一致。
net/http
在 net/http
包中,StripPrefix
的行为已更改,除了从请求 URL 的 Path
字段中剥离前缀外,还会从其 RawPath
字段中剥离前缀。在过去的版本中,只有 Path
字段被修剪,因此如果请求 URL 包含任何转义字符,则 URL 将被修改为具有不匹配的 Path
和 RawPath
字段。在 Go 1.16 中,StripPrefix
修剪了这两个字段。如果请求 URL 的前缀部分包含转义字符,则处理程序会返回 404,而不是以前的行为,即调用底层处理程序,并使用不匹配的 Path
/RawPath
对。
net/http
包现在拒绝形式为 "Range": "bytes=--N"
的 HTTP 范围请求,其中 "-N"
是负后缀长度,例如 "Range": "bytes=--2"
。它现在回复 416 "Range Not Satisfiable"
响应。
使用 SameSiteDefaultMode
设置的 Cookie 现在会根据当前规范(没有设置属性)进行行为,而不是生成没有值的 SameSite 键。
Client
现在在带有空正文的 PATCH
请求中发送显式的 Content-Length:
0
头部,与现有的 POST
和 PUT
行为一致。
ProxyFromEnvironment
函数不再为 https://
URL 返回 HTTP_PROXY
环境变量的设置,当 HTTPS_PROXY
未设置时。
Transport
类型有一个新的字段 GetProxyConnectHeader
,它可以设置为一个函数,该函数在 CONNECT
请求期间返回要发送到代理的标头。实际上 GetProxyConnectHeader
是现有字段 ProxyConnectHeader
的动态版本;如果 GetProxyConnectHeader
不是 nil
,则 ProxyConnectHeader
被忽略。
新的 http.FS
函数将 fs.FS
转换为 http.FileSystem
。
net/http/httputil
ReverseProxy
现在在代理带有未知主体长度的流式响应时,更积极地刷新缓冲数据。
net/smtp
Client
的 Mail
方法现在向支持它的服务器发送 SMTPUTF8
指令,表示地址以 UTF-8 编码。
os
Process.Signal
现在返回 ErrProcessDone
,而不是在进程已完成时返回未导出的 errFinished
。
该包定义了一个新类型 DirEntry
,它是 fs.DirEntry
的别名。新的 ReadDir
函数和新的 File.ReadDir
方法可用于将目录的内容读入 DirEntry
数组中。File.Readdir
方法(请注意 dir
中的 d
为小写)仍然存在,它返回 FileInfo
数组,但对于大多数程序来说,切换到 File.ReadDir
会更有效率。
该包现在定义了 CreateTemp
、MkdirTemp
、ReadFile
和 WriteFile
,它们将用于替代 io/ioutil
包中定义的函数。
FileInfo
、FileMode
和 PathError
现在是 io/fs
包中同名类型的别名。os
包中的函数签名已更新为引用 io/fs
包中的名称。这不会影响任何现有的代码。
新的 DirFS
函数提供了一个 fs.FS
的实现,它由操作系统文件的树结构支持。
os/signal
新的 NotifyContext
函数允许创建在特定信号到达时取消的上下文。
path
Match
函数现在如果模式的不匹配部分存在语法错误,则返回错误。以前,该函数在匹配失败时提前返回,因此不会报告模式中任何后面的语法错误。
path/filepath
新的函数 WalkDir
与 Walk
相似,但通常更有效率。传递给 WalkDir
的函数接收 fs.DirEntry
而不是 fs.FileInfo
。(为了澄清那些记得 Walk
函数接收 os.FileInfo
的人,os.FileInfo
现在是 fs.FileInfo
的别名。)
Match
和 Glob
函数现在如果模式的不匹配部分存在语法错误,则返回错误。以前,这些函数在匹配失败时提前返回,因此不会报告模式中任何后面的语法错误。
reflect
Zero 函数已被优化,避免分配。错误地使用 ==
或 DeepEqual
将返回的 Value 与另一个 Value 进行比较的代码可能会获得与之前 Go 版本中获得的结果不同的结果。reflect.Value
的文档描述了如何正确地比较两个 Value
。
runtime/debug
启用 SetPanicOnFault
时使用的 runtime.Error
值现在可能具有 Addr
方法。如果该方法存在,则它返回触发故障的内存地址。
strconv
ParseFloat
现在使用 Eisel-Lemire 算法,将性能提高了 2 倍。这也可能加快诸如 encoding/json
之类的文本格式的解码速度。
syscall
NewCallback
和 NewCallbackCDecl
现在正确地支持具有多个连续的子 uintptr
大小参数的回调函数。这可能需要更改这些函数的使用方式,以消除小参数之间的手动填充。
Windows 上的 SysProcAttr
具有一个新的 NoInheritHandles
字段,它在创建新进程时禁用继承句柄。
Windows 上的 DLLError
现在有一个 Unwrap
方法,用于解包其底层错误。
在 Linux 上,Setgid
、Setuid
及相关调用现在已实现。以前,它们返回 syscall.EOPNOTSUPP
错误。
在 Linux 上,新的函数 AllThreadsSyscall
和 AllThreadsSyscall6
可用于在进程中的所有 Go 线程上执行系统调用。这些函数只能由不使用 cgo 的程序使用;如果程序使用 cgo,则它们将始终返回 syscall.ENOTSUP
。
testing/iotest
新的 ErrReader
函数返回一个始终返回错误的 io.Reader
。
新的 TestReader
函数测试 io.Reader
是否按预期行为。
text/template
现在允许在操作分隔符内使用换行符,从而允许操作跨越多行。
新的 template.ParseFS
函数和 template.Template.ParseFS
方法类似于 template.ParseGlob
和 template.Template.ParseGlob
,但它们从 fs.FS
中读取模板。
text/template/parse
parse.Tree
中新增了 CommentNode
。parse.Tree
中的 Mode
字段可用于访问它。
time/tzdata
现在 $GOROOT/lib/time/zoneinfo.zip
中的时区数据库和此包中嵌入的副本使用精简的时区数据格式。这将时区数据库的大小减少了约 350 KB。
unicode
该系统中的unicode
包及其相关支持已从 Unicode 12.0.0 升级到Unicode 13.0.0,增加了 5,930 个新字符,包括四个新的脚本和 55 个新的表情符号。Unicode 13.0.0 还将平面 3 (U+30000-U+3FFFF) 指定为三级表意文字平面。