Go 1.5 版本说明
Go 1.5 简介
最新的 Go 版本 1.5 是一个重要的版本,包括对实现的重大架构更改。尽管如此,我们预计几乎所有 Go 程序都将像以前一样继续编译和运行,因为该版本仍然保持 Go 1 兼容性承诺。
实现方面最大的改进是
- 编译器和运行时现在完全用 Go(以及少量汇编语言)编写。C 不再参与实现,因此曾经用于构建发行版的 C 编译器已消失。
- 垃圾回收器现在是 并发的,并且通过在可能的情况下与其他 goroutine 并行运行,提供了显著更低的暂停时间。
- 默认情况下,Go 程序运行时
GOMAXPROCS
设置为可用内核数;在之前的版本中,它默认为 1。 - 现在为所有存储库(不仅仅是 Go 核心)提供了对 内部包的支持。
go
命令现在为“供应商”外部依赖项提供 实验性支持。- 新的
go tool trace
命令支持对程序执行进行细粒度的跟踪。 - 新的
go doc
命令(与godoc
不同)针对命令行使用进行了定制。
下面将讨论这些以及对实现和工具的其他一些更改。
该版本还包含一个与映射字面量相关的小型语言更改。
最后,发布的时间偏离了通常的六个月间隔,既是为了提供更多时间来准备此主要版本,也是为了此后调整时间表,以便更方便地安排发布日期。
语言更改
映射字面量
由于疏忽,允许从切片字面量中省略元素类型的规则没有应用于映射键。这已在 Go 1.5 中 得到纠正。一个例子可以说明这一点。从 Go 1.5 开始,此映射字面量:
m := map[Point]string{
Point{29.935523, 52.891566}: "Persepolis",
Point{-25.352594, 131.034361}: "Uluru",
Point{37.422455, -122.084306}: "Googleplex",
}
可以按如下方式编写,无需显式列出 Point
类型
m := map[Point]string{
{29.935523, 52.891566}: "Persepolis",
{-25.352594, 131.034361}: "Uluru",
{37.422455, -122.084306}: "Googleplex",
}
实现
不再使用 C
编译器和运行时现在使用 Go 和汇编语言实现,不使用 C。树中仅剩的 C 源代码与测试或 cgo
相关。1.4 及更早版本中树中有一个 C 编译器。它用于构建运行时;自定义编译器在一定程度上是必要的,以保证 C 代码能够与 goroutine 的栈管理一起工作。由于运行时现在是用 Go 编写的,因此不需要此 C 编译器,并且它已消失。关于消除 C 的过程的详细信息在 其他地方讨论。
C 的转换是在为该工作创建的自定义工具的帮助下完成的。最重要的是,编译器实际上是通过将 C 代码自动转换为 Go 来移动的。它实际上是在不同的语言中相同的程序。它不是编译器的新实现,因此我们预计该过程不会引入新的编译器错误。有关此过程的概述,请参阅 此演示文稿的幻灯片。
编译器和工具
独立于但受迁移到 Go 的鼓励,工具的名称已更改。旧名称 6g
、8g
等已消失;取而代之的是只有一个二进制文件,可以访问为 go
tool
compile
,它将 Go 源代码编译成适合由 $GOARCH
和 $GOOS
指定的体系结构和操作系统的二进制文件。类似地,现在有一个链接器 (go
tool
link
) 和一个汇编器 (go
tool
asm
)。链接器是从旧的 C 实现自动转换的,但汇编器是下面将详细讨论的新本机 Go 实现。
与 6g
、8g
等名称的删除类似,编译器和汇编器的输出现在使用简单的 .o
后缀而不是 .8
、.6
等。
垃圾回收器
垃圾回收器已在 1.5 中重新设计,作为 设计文档中概述的开发的一部分。通过结合高级算法、更好的 回收器调度以及更多地与用户程序并行运行回收,预期延迟比之前版本中的回收器低得多。回收器的“停止世界”阶段几乎总是小于 10 毫秒,通常更短。
对于受益于低延迟的系统(例如响应用户请求的网站),新回收器带来的预期延迟下降可能很重要。
新回收器的详细信息在 GopherCon 2015 上的 演讲中进行了介绍。
运行时
在 Go 1.5 中,goroutine 调度的顺序已更改。调度程序的属性从未由语言定义,但依赖于调度顺序的程序可能会因此更改而中断。我们已经看到一些(错误的)程序受到此更改的影响。如果您有隐式依赖于调度顺序的程序,则需要更新它们。
另一个可能导致中断的更改是运行时现在将同时运行的线程默认数量(由 GOMAXPROCS
定义)设置为 CPU 上可用的内核数。在之前的版本中,默认为 1。不希望使用多个内核运行的程序可能会意外中断。可以通过删除限制或显式设置 GOMAXPROCS
来更新它们。有关此更改的更详细讨论,请参阅 设计文档。
构建
现在 Go 编译器和运行时是用 Go 实现的,因此必须提供 Go 编译器才能从源代码编译发行版。因此,要构建 Go 核心,必须已存在一个可用的 Go 发行版。(不从事核心工作的 Go 程序员不受此更改的影响。)任何 Go 1.4 或更高版本的发行版(包括 gccgo
)都可以使用。有关详细信息,请参阅 设计文档。
端口
主要是由于行业转向 32 位 x86 架构,1.5 中提供的二进制下载集减少了。仅为 amd64
体系结构(而不是 386
)提供 OS X 操作系统发行版。类似地,Snow Leopard (Apple OS X 10.6) 的端口仍然有效,但不再作为下载发布或维护,因为 Apple 不再维护该版本的 OS X。此外,dragonfly/386
端口完全不受支持,因为 DragonflyBSD 本身不再支持 32 位 386 架构。
但是,有几个新的端口可供从源代码构建。这些包括 darwin/arm
和 darwin/arm64
。新的端口 linux/arm64
大致到位,但 cgo
仅支持使用外部链接。
作为实验,还可以使用 ppc64
和 ppc64le
(64 位 PowerPC,大端和小端)。这两个端口都支持 cgo
,但仅支持内部链接。
在 FreeBSD 上,Go 1.5 需要 FreeBSD 8-STABLE+,因为它新使用了 SYSCALL
指令。
在 NaCl 上,Go 1.5 需要 SDK 版本 pepper-41。由于从 NaCl 运行时中删除了 sRPC 子系统,因此更新的 pepper 版本不兼容。
在 Darwin 上,可以使用 ios
构建标签禁用系统 X.509 证书接口的使用。
Solaris 端口现在完全支持 cgo 和 net
和 crypto/x509
软件包,以及许多其他修复和改进。
工具
转换
作为从树中消除 C 的过程的一部分,编译器和链接器已从 C 转换为 Go。这是一次真正的(机器辅助)转换,因此新程序本质上是转换后的旧程序,而不是带有新错误的新程序。我们相信转换过程引入的错误很少,如果有的话,并且实际上发现了一些以前未知的错误,现在已修复。
但是,汇编器是一个新程序;它在下面描述。
重命名
编译器 (6g
、8g
等)、汇编器 (6a
、8a
等) 和链接器 (6l
、8l
等) 的程序套件已合并为一个工具,该工具由环境变量 GOOS
和 GOARCH
配置。旧名称已消失;新工具可通过 go
tool
机制访问,例如 go tool compile
、go tool asm
和 go tool link
。此外,中间对象文件的 .6
、.8
等文件后缀也消失了;现在它们只是普通的 .o
文件。
例如,要使用工具直接为 Darwin 构建和链接 amd64 上的程序(而不是通过 go build
),需要运行
$ export GOOS=darwin GOARCH=amd64
$ go tool compile program.go
$ go tool link program.o
移动
因为 go/types
包现在已移至主存储库(请参见下文),所以 vet
和 cover
工具也已移动。它们不再在外部 golang.org/x/tools
存储库中维护,尽管(已弃用)源代码仍然存在以与旧版本兼容。
编译器
如上所述,Go 1.5 中的编译器是一个单一的 Go 程序,它从旧的 C 源代码转换而来,用于替换 6g
、8g
等。其目标由环境变量 GOOS
和 GOARCH
配置。
1.5 编译器与旧编译器基本相同,但一些内部细节已更改。一项重大更改是常量的计算现在使用 math/big
包,而不是自定义(且测试不足)的高精度算术实现。我们预计这不会影响结果。
仅对于 amd64 体系结构,编译器有一个新选项 -dynlink
,它通过支持对外部共享库中定义的 Go 符号的引用来协助动态链接。
汇编器
与编译器和链接器类似,Go 1.5 中的汇编器是一个单一程序,用于替换汇编器套件 (6a
、8a
等),并且环境变量 GOARCH
和 GOOS
配置体系结构和操作系统。与其他程序不同,汇编器是用 Go 编写的全新程序。
新汇编器与之前的汇编器非常兼容,但有一些更改可能会影响一些汇编器源文件。请参阅更新的 汇编器指南,以获取有关这些更改的更多具体信息。总之
首先,用于常量的表达式求值略有不同。它现在使用无符号 64 位算术,并且运算符(+
、-
、<<
等)的优先级来自 Go,而不是 C。我们预计这些更改会影响极少的程序,但可能需要手动验证。
也许更重要的是,在SP
或 PC
仅作为编号寄存器的别名(例如,ARM 上堆栈指针为 R13
,硬件程序计数器为 R15
)的机器上,对不包含符号的此类寄存器的引用现在是非法的。例如,SP
和 4(SP)
是非法的,但 sym+4(SP)
是可以的。在这样的机器上,要引用硬件寄存器,请使用其真实的 R
名称。
一个小的变化是,一些旧的汇编程序允许使用以下表示法
constant=value
来定义一个命名常量。由于这始终可以通过传统的类 C 的 #define
表示法来实现,并且该表示法仍然受支持(汇编器包含一个简化的 C 预处理器实现),因此该功能已被移除。
链接器
Go 1.5 中的链接器现在是一个 Go 程序,它替换了 6l
、8l
等。其操作系统和指令集由环境变量 GOOS
和 GOARCH
指定。
还有一些其他的更改。最重要的是添加了一个 -buildmode
选项,该选项扩展了链接的风格;它现在支持构建共享库以及允许其他语言调用 Go 库等情况。其中一些在设计文档中进行了概述。有关可用构建模式及其用法的列表,请运行
$ go help buildmode
另一个细微的更改是,链接器不再在 Windows 可执行文件的头部记录构建时间戳。此外,尽管这可能会得到修复,但 Windows cgo 可执行文件缺少一些 DWARF 信息。
最后,-X
标志接受两个参数,例如
-X importpath.name value
现在也接受更常见的 Go 标志样式,该样式使用单个参数,该参数本身是一个 name=value
对
-X importpath.name=value
尽管旧语法仍然有效,但建议将脚本等中此标志的使用更新为新形式。
Go 命令
go
命令的基本操作保持不变,但有一些值得注意的更改。
之前的版本引入了包内部的目录无法通过 go
命令导入的概念。在 1.4 中,它通过在核心存储库中引入一些内部元素进行了测试。正如设计文档中所建议的那样,此更改现在可用于所有存储库。规则在设计文档中进行了说明,但总而言之,名为 internal
的目录中或其下的任何包都可以被同一个子树中根目录下的包导入。现有的目录元素名为 internal
的包可能会受到此更改的意外破坏,这就是在上一版本中对其进行宣传的原因。
处理包的另一种更改是实验性地增加了对“供应商”的支持。有关详细信息,请参阅go
命令和设计文档的文档。
还有一些小的更改。阅读文档以获取完整详细信息。
- SWIG 支持已更新,因此
.swig
和.swigcxx
现在需要 SWIG 3.0.6 或更高版本。 install
子命令现在将删除源目录中build
子命令创建的二进制文件(如果存在),以避免树中存在两个二进制文件的问题。std
(标准库)通配符包名现在排除命令。一个新的cmd
通配符涵盖了命令。- 新的
-asmflags
构建选项设置传递给汇编器的标志。但是,-ccflags
构建选项已被删除;它特定于旧的(现在已删除的)C 编译器。 - 新的
-buildmode
构建选项设置构建模式,如上所述。 - 新的
-pkgdir
构建选项设置已安装包归档文件的位置,以帮助隔离自定义构建。 - 新的
-toolexec
构建选项允许替换不同的命令以调用编译器等。这充当go tool
的自定义替换。 test
子命令现在有一个-count
标志,用于指定运行每个测试和基准测试的次数。testing
包通过-test.count
标志在此处执行工作。generate
子命令有几个新功能。-run
选项指定一个正则表达式来选择要执行的指令;这在 1.4 中已被提出但从未实现。执行模式现在可以访问两个新的环境变量:$GOLINE
返回指令的源代码行号,$DOLLAR
扩展为美元符号。get
子命令现在有一个-insecure
标志,如果从不安全的存储库(一个不加密连接的存储库)获取,则必须启用该标志。
Go vet 命令
go tool vet
命令现在对结构体标签进行更彻底的验证。
跟踪命令
提供了一个用于 Go 程序动态执行跟踪的新工具。用法类似于测试覆盖率工具的工作方式。跟踪的生成集成到 go test
中,然后跟踪工具本身的单独执行分析结果
$ go test -trace=trace.out path/to/package
$ go tool trace [flags] pkg.test trace.out
这些标志使输出能够在浏览器窗口中显示。有关详细信息,请运行 go tool trace -help
。GopherCon 2015 的此演讲中也对跟踪功能进行了描述。
Go doc 命令
在几个版本之前,go doc
命令被删除,因为它是不必要的。人们总是可以运行“godoc .
”来代替。1.5 版本引入了一个新的go doc
命令,它具有比 godoc
更方便的命令行界面。它专为命令行使用而设计,并根据调用提供包或其元素文档的更紧凑和集中的呈现。它还提供不区分大小写的匹配和支持显示未导出符号的文档。有关详细信息,请运行“go help doc
”。
Cgo
在解析 #cgo
行时,调用 ${SRCDIR}
现在扩展为源目录的路径。这允许将选项传递给编译器和链接器,这些选项涉及相对于源代码目录的文件路径。如果没有扩展,当当前工作目录更改时,路径将无效。
Solaris 现在具有完整的 cgo 支持。
在 Windows 上,cgo 现在默认使用外部链接。
当 C 结构体以零大小的字段结尾,但结构体本身不是零大小的时,Go 代码不能再引用零大小的字段。任何此类引用都必须重写。
性能
与往常一样,更改非常普遍和多样,因此很难做出关于性能的精确陈述。此版本中的更改范围甚至比往常更广,其中包括一个新的垃圾收集器以及将运行时转换为 Go。一些程序可能会运行得更快,一些程序可能会运行得更慢。平均而言,Go 1 基准测试套件中的程序在 Go 1.5 中的运行速度比在 Go 1.4 中快几%,而如上所述,垃圾收集器的暂停时间大大缩短,几乎始终低于 10 毫秒。
Go 1.5 中的构建速度将降低约两倍。编译器和链接器从 C 到 Go 的自动转换导致了非惯用的 Go 代码,与编写良好的 Go 代码相比,其性能较差。分析工具和重构有助于改进代码,但还有很多工作要做。进一步的分析和优化将在 Go 1.6 和未来的版本中继续进行。有关更多详细信息,请参阅这些幻灯片和相关的视频。
标准库
标志
标志包的PrintDefaults
函数(以及FlagSet
上的方法)已修改为创建更友好的使用消息。格式已更改为更人性化,并且在使用消息中,用反引号引起来的单词被视为标志的操作数的名称,以便在使用消息中显示。例如,使用以下调用创建的标志,
cpuFlag = flag.Int("cpu", 1, "run `N` processes in parallel")
将显示帮助消息,
-cpu N
run N processes in parallel (default 1)
此外,仅当默认值不是类型的零值时才会列出它。
math/big 中的浮点数
math/big
包有一个新的基本数据类型Float
,它实现了任意精度的浮点数。Float
值由布尔类型的符号、可变长度的尾数和 32 位固定大小的有符号指数表示。Float
的精度(尾数大小以位为单位)可以显式指定,或者由创建该值的第一个操作确定。创建后,可以使用SetPrec
方法修改 Float
尾数的大小。Float
支持无穷大的概念,例如溢出创建的无穷大,但会导致等效于 IEEE 754 NaN 的值会导致 panic。Float
操作支持所有 IEEE-754 舍入模式。当精度设置为 24(53)位时,保留在归一化 float32
(float64
)值的范围内的操作产生的结果与这些值上相应的 IEEE-754 算术运算产生的结果相同。
Go 类型
到目前为止,go/types
包一直维护在 golang.org/x
存储库中;从 Go 1.5 开始,它已被重新定位到主存储库。旧位置的代码现在已弃用。包中还有一个适度的 API 更改,如下所述。
与此移动相关,go/constant
包也移动到了主存储库;它以前是 golang.org/x/tools/exact
。 go/importer
包也移动到了主存储库,以及上面描述的一些工具。
网络
net 包中的 DNS 解析器几乎一直都使用cgo
来访问系统接口。Go 1.5 中的一个变化意味着,在大多数 Unix 系统上,DNS 解析将不再需要cgo
,这简化了在这些平台上的执行。现在,如果系统的网络配置允许,则可以使用本机 Go 解析器。此更改的重要影响是,每个 DNS 解析都占用一个 goroutine 而不是一个线程,因此具有多个未完成 DNS 请求的程序将消耗更少的操作系统资源。
如何运行解析器的决定是在运行时进行的,而不是在构建时进行的。netgo
构建标签以前用于强制使用 Go 解析器,现在不再需要,尽管它仍然有效。新的netcgo
构建标签强制在构建时使用cgo
解析器。要在运行时强制使用cgo
解析,请在环境中设置GODEBUG=netdns=cgo
。更多调试选项在这里有说明。
此更改仅适用于 Unix 系统。Windows、Mac OS X 和 Plan 9 系统的行为与以前相同。
反射
reflect
包有两个新函数:ArrayOf
和FuncOf
。这些函数类似于现有的SliceOf
函数,在运行时创建新的类型来描述数组和函数。
强化
使用go-fuzz
工具进行随机测试时,在标准库中发现了数十个错误。已在archive/tar
、archive/zip
、compress/flate
、encoding/gob
、fmt
、html/template
、image/gif
、image/jpeg
、image/png
和text/template
包中修复了这些错误。这些修复增强了实现对错误和恶意输入的抵御能力。
库的次要更改
archive/zip
包的Writer
类型现在有一个SetOffset
方法,用于指定在输出流中写入归档文件的起始位置。bufio
包中的Reader
现在有一个Discard
方法,用于丢弃输入中的数据。- 在
bytes
包中,Buffer
类型现在有一个Cap
方法,用于报告在缓冲区中分配的字节数。类似地,在bytes
和strings
包中,Reader
类型现在有一个Size
方法,用于报告底层切片或字符串的原始长度。 bytes
和strings
包现在都有一个LastIndexByte
函数,用于查找参数中具有该值的最后一个字节。crypto
包有一个新的接口Decrypter
,它抽象了非对称解密中使用的私钥的行为。- 在
crypto/cipher
包中,Stream
接口的文档已澄清了源和目标长度不同的情况下的行为。如果目标比源短,则方法将出现 panic。这不是实现上的变化,只是文档上的变化。 - 同样在
crypto/cipher
包中,现在支持 AES 的 Galois/Counter 模式 (GCM) 中除 96 字节以外的其他 nonce 长度,某些协议需要此功能。 - 在
crypto/elliptic
包中,CurveParams
结构体中现在有一个Name
字段,并且包中实现的曲线已命名。这些名称提供了一种更安全的方式来选择曲线,而不是选择其位大小,适用于依赖于曲线的加密系统。 - 同样在
crypto/elliptic
包中,Unmarshal
函数现在会验证点是否确实在曲线上。(如果不是,则函数返回 nil)。此更改可以防止某些攻击。 crypto/sha512
包现在支持 SHA-512 哈希算法的两个截断版本,SHA-512/224 和 SHA-512/256。crypto/tls
包的最小协议版本现在默认为 TLS 1.0。旧的默认值 SSLv3 仍然可以通过Config
获得,如果需要的话。crypto/tls
包现在支持 RFC 6962 中指定的已签名证书时间戳 (SCT)。如果服务器在Certificate
结构体中列出了 SCT,则服务器会提供它们,客户端会请求它们并在其ConnectionState
结构体中公开它们(如果存在)。- 固定到
crypto/tls
客户端连接的 OCSP 响应以前仅可通过OCSPResponse
方法获得,现在已在ConnectionState
结构体中公开。 crypto/tls
服务器实现现在将始终调用Config
结构体中的GetCertificate
函数来选择连接的证书,而无需提供任何证书。- 最后,
crypto/tls
包中的会话票证密钥现在可以在服务器运行时更改。这是通过Config
类型的新的SetSessionTicketKeys
方法完成的。 - 在
crypto/x509
包中,通配符现在仅在最左侧的标签中接受,如规范中所定义。 - 同样在
crypto/x509
包中,未知关键扩展的处理方式已更改。它们过去会导致解析错误,但现在它们会被解析,并且仅在Verify
中导致错误。Certificate
的新字段UnhandledCriticalExtensions
记录了这些扩展。 database/sql
包的DB
类型现在有一个Stats
方法来检索数据库统计信息。debug/dwarf
包进行了大量添加,以更好地支持 DWARF 版本 4。例如,请参见新类型Class
的定义。debug/dwarf
包现在还支持解码 DWARF 行表。debug/elf
包现在支持 64 位 PowerPC 架构。encoding/base64
包现在通过两个新的编码变量RawStdEncoding
和RawURLEncoding
支持无填充编码。encoding/json
包现在如果 JSON 值不适合目标变量或正在对其进行解组的组件,则返回UnmarshalTypeError
。encoding/json
的Decoder
类型有一个新方法,为解码 JSON 文档提供流式接口:Token
。它还与Decode
的现有功能互操作,Decode
将继续使用Decoder.Token
启动的解码操作。flag
包有一个新函数UnquoteUsage
,用于帮助使用上面描述的新约定创建使用消息。- 在
fmt
包中,类型为Value
的值现在打印它包含的内容,而不是使用reflect.Value
的Stringer
方法,后者会生成诸如<int Value>
之类的内容。 go/ast
包中的EmptyStmt
类型现在有一个布尔Implicit
字段,用于记录分号是隐式添加还是出现在源代码中。- 为了向前兼容,
go/build
包为 Go 可能有一天会支持的一些架构保留了GOARCH
值。这不是承诺它会支持。此外,Package
结构体现在有一个PkgTargetRoot
字段,用于存储如果已知则在其中安装的依赖于架构的根目录。 - (新迁移的)
go/types
包允许用户使用新的Qualifier
函数类型作为几个函数的参数来控制附加到包级名称的前缀。这对包来说是一个 API 更改,但由于它对核心是新的,因此不会破坏 Go 1 兼容性规则,因为使用该包的代码必须在其新位置显式请求它。要更新,请在您的包上运行go fix
。 - 在
image
包中,Rectangle
类型现在实现了Image
接口,因此Rectangle
可以在绘图时用作蒙版。 - 同样在
image
包中,为了帮助处理一些 JPEG 图像,现在支持 4:1:1 和 4:1:0 YCbCr 下采样以及基本的 CMYK 支持,由新的image.CMYK
结构体表示。 image/color
包通过新的CMYK
结构体、CMYKModel
颜色模型和CMYKToRGB
函数添加了基本的 CMYK 支持,某些 JPEG 图像需要这些功能。image/color
包中还改进了YCbCr
值转换为RGBA
的精度。以前,低 8 位只是高 8 位的副本;现在它们包含更准确的信息。由于旧代码的回显属性,提取 8 位红色值的运算uint8(r)
可以工作,但并不正确。在 Go 1.5 中,该运算可能会产生不同的值。正确的代码是,并且一直都是,选择高 8 位:uint8(r>>8)
。顺便说一句,image/draw
包提供了对这种转换的更好支持;有关更多信息,请参阅 这篇博文。- 最后,从 Go 1.5 开始,
Index
中最近匹配检查现在会考虑 alpha 通道。 image/gif
包包含了一些泛化。多帧 GIF 文件现在可以具有与所有包含的单个帧的边界不同的整体边界。此外,GIF
结构体现在具有一个Disposal
字段,用于指定每帧的处置方法。io
包添加了一个CopyBuffer
函数,它类似于Copy
,但使用调用者提供的缓冲区,允许控制分配和缓冲区大小。log
包有一个新的LUTC
标志,它会导致时间戳以 UTC 时区打印。它还为用户创建的日志记录器添加了一个SetOutput
方法。- 在 Go 1.4 中,
Max
未检测到所有可能的 NaN 位模式。这在 Go 1.5 中已修复,因此在包含 NaN 的数据上使用math.Max
的程序的行为可能会有所不同,但现在根据 IEEE754 对 NaN 的定义正确执行。 math/big
包为整数添加了一个新的Jacobi
函数,并为Int
类型添加了一个新的ModSqrt
方法。- mime 包添加了一个新的
WordDecoder
类型来解码包含 RFC 204 编码单词的 MIME 标头。它还提供BEncoding
和QEncoding
作为 RFC 2045 和 RFC 2047 编码方案的实现。 mime
包还添加了一个ExtensionsByType
函数,该函数返回已知与给定 MIME 类型关联的 MIME 扩展名。- 有一个新的
mime/quotedprintable
包,它实现了 RFC 2045 定义的可打印引号编码。 net
包现在将按顺序尝试每个 IP 地址,直到一个成功为止,才能Dial
主机名。Dialer.DualStack
模式现在通过为第一个地址族提供 300 毫秒的提前量来实现 Happy Eyeballs (RFC 6555);此值可以通过新的Dialer.FallbackDelay
覆盖。net
包中错误返回的类型的一些不一致性已得到整理。现在大多数返回一个OpError
值,其中包含比以前更多的信息。此外,OpError
类型现在包含一个Source
字段,该字段保存本地网络地址。net/http
包现在支持从服务器Handler
设置尾部。有关详细信息,请参阅ResponseWriter
的文档。- 通过设置新的
Request.Cancel
字段,有一种取消net/http
Request
的新方法。http.Transport
支持它。Cancel
字段的类型与context.Context.Done
返回值兼容。 - 同样在
net/http
包中,有一些代码可以忽略ServeContent
函数中的零Time
值。从 Go 1.5 开始,它现在还忽略等于 Unix 纪元的时间值。 net/http/fcgi
包导出了两个新错误,ErrConnClosed
和ErrRequestAborted
,以报告相应的错误条件。net/http/cgi
包存在一个错误,该错误错误地处理了环境变量REMOTE_ADDR
和REMOTE_HOST
的值。这已修复。此外,从 Go 1.5 开始,该包设置REMOTE_PORT
变量。net/mail
包添加了一个AddressParser
类型,该类型可以解析邮件地址。net/smtp
包现在有一个TLSConnectionState
访问器,用于Client
类型,该访问器返回客户端的 TLS 状态。os
包有一个新的LookupEnv
函数,它类似于Getenv
,但可以区分空环境变量和缺少的环境变量。os/signal
包添加了新的Ignore
和Reset
函数。runtime
、runtime/trace
和net/http/pprof
包分别具有新的函数来支持上面描述的跟踪功能:ReadTrace
、StartTrace
、StopTrace
、Start
、Stop
和Trace
。有关详细信息,请参阅各自的文档。runtime/pprof
包现在默认情况下在所有内存配置文件中包含总体内存统计信息。strings
包有一个新的Compare
函数。提供此函数是为了与bytes
包保持对称,但在其他情况下则没有必要,因为字符串本身支持比较。sync
包中的WaitGroup
实现现在可以诊断在对Add
的调用与Wait
的返回值之间发生竞争的代码。如果检测到此条件,则实现将引发 panic。- 在
syscall
包中,LinuxSysProcAttr
结构体现在有一个GidMappingsEnableSetgroups
字段,这是由 Linux 3.19 中的安全更改引起的。在所有 Unix 系统上,该结构体还具有新的Foreground
和Pgid
字段,以便在执行时提供更多控制。在 Darwin 上,现在有一个Syscall9
函数来支持具有过多参数的调用。 testing/quick
现在将为指针类型生成nil
值,使其可以与递归数据结构一起使用。此外,该包现在支持生成数组类型。- 在
text/template
和html/template
包中,太大而无法表示为 Go 整数的整数常量现在会触发解析错误。之前,它们会静默转换为浮点数,从而损失精度。 - 同样在
text/template
和html/template
包中,新的Option
方法允许在执行期间自定义模板的行为。唯一实现的选项允许控制在索引映射时如何处理丢失的键。默认值(现在可以覆盖)与以前相同:继续使用无效值。 time
包的Time
类型有一个新的方法AppendFormat
,它可用于在打印时间值时避免分配。unicode
包和整个系统中的相关支持已从版本 7.0 升级到 Unicode 8.0。