Go 1.8 发布说明

Go 1.8 简介

Go 最新版本 1.8 在 Go 1.7 发布六个月后发布。 其大部分变更集中在工具链、运行时和库的实现层面。 语言规范方面有两处小改动。 一如既往,此版本遵循 Go 1 兼容性承诺。 我们预期几乎所有 Go 程序将继续像之前一样编译和运行。

此版本新增了 32 位 MIPS 支持更新了编译器后端 以生成更高效的代码, 减少了 GC 暂停(通过消除 stop-the-world 栈重扫描), 增加了 HTTP/2 Push 支持增加了 HTTP 优雅关闭功能增强了 context 支持启用了互斥锁性能分析, 并简化了切片排序

语言变更

从 Go 1.8 开始,在将一个结构体类型的值显式转换为另一个结构体类型时,标签将被忽略。因此,仅标签不同的两个结构体可以相互转换:

func example() {
    type T1 struct {
        X int `json:"foo"`
    }
    type T2 struct {
        X int `json:"bar"`
    }
    var v1 T1
    var v2 T2
    v1 = T1(v2) // 现在合法
}

语言规范现在仅要求实现支持浮点常量中最多 16 位的指数。这不会影响 “gc” 或 gccgo 编译器,它们仍然支持 32 位指数。

平台支持

Go 现在支持 Linux 上的 32 位 MIPS,包括大端序 (linux/mips) 和小端序 (linux/mipsle) 机器, 前提是它们实现了 MIPS32r1 指令集并具备 FPU 或内核 FPU 模拟。 请注意,许多常见的基于 MIPS 的路由器缺少 FPU,并且其固件未启用内核 FPU 模拟; Go 将无法在此类机器上运行。

在 DragonFly BSD 上,Go 现在要求 DragonFly 4.4.4 或更高版本。

在 OpenBSD 上,Go 现在要求 OpenBSD 5.9 或更高版本。

Plan 9 移植版的网络支持现在更加完善, 在截止时间和取消操作方面的行为与 Unix 和 Windows 保持一致。 有关 Plan 9 内核要求,请参阅 Plan 9 wiki 页面

Go 1.8 现在仅支持 OS X 10.8 或更高版本。这很可能是最后一个支持 10.8 的 Go 版本。 在更旧的 OS X 版本上编译 Go 或运行二进制文件未经测试。

Go 1.8 将是最后一个支持 Linux 上 ARMv5E 和 ARMv6 处理器的版本: Go 1.9 很可能要求 ARMv6K(如 Raspberry Pi 1 中所见)或更高版本。 要识别 Linux 系统是否为 ARMv6K 或更高版本,请运行 “go tool dist -check-armv6k” (为方便测试,也可以仅将 dist 命令复制到系统,而无需安装完整的 Go 1.8 副本), 如果程序以输出 “ARMv6K supported.” 终止,则表明该系统实现了 ARMv6K 或更高版本。 在非 Linux 的 ARM 系统上,Go 已经要求 ARMv6K 或更高版本。

zos 现在是 GOOS 的一个公认值,为 z/OS 操作系统保留。

已知问题

在 FreeBSD 和 NetBSD 上存在一些已知但尚未完全理解的不稳定性。 在极少数情况下可能导致程序崩溃。 请参阅 issue 15658issue 16511。 欢迎任何帮助解决这些问题。

工具

汇编器

对于 64 位 x86 系统,新增了以下指令: VBROADCASTSDBROADCASTSSMOVDDUPMOVSHDUPMOVSLDUPVMOVDDUPVMOVSHDUPVMOVSLDUP

对于 64 位 PPC 系统,新增了通用向量标量指令: LXSLXSDXLXSILXSIWAXLXSIWZXLXVLXVD2XLXVDSXLXVW4XMFVSRMFVSRDMFVSRWZMTVSRMTVSRDMTVSRWAMTVSRWZSTXSSTXSDXSTXSISTXSIWXSTXVSTXVD2XSTXVW4XXSCVXSCVDPSPXSCVDPSPNXSCVDPSXDSXSCVDPSXWSXSCVDPUXDSXSCVDPUXWSXSCVSPDPXSCVSPDPNXSCVSXDDPXSCVSXDSPXSCVUXDDPXSCVUXDSPXSCVXXSCVXPXVCVXVCVDPSPXVCVDPSXDSXVCVDPSXWSXVCVDPUXDSXVCVDPUXWSXVCVSPDPXVCVSPSXDSXVCVSPSXWSXVCVSPUXDSXVCVSPUXWSXVCVSXDDPXVCVSXDSPXVCVSXWDPXVCVSXWSPXVCVUXDDPXVCVUXDSPXVCVUXWDPXVCVUXWSPXVCVXXVCVXPXXLANDXXLANDCXXLANDQXXLEQVXXLNANDXXLNORXXLORXXLORCXXLORQXXLXORXXMRGXXMRGHWXXMRGLWXXPERMXXPERMDIXXSELXXSIXXSLDWIXXSPLTXXSPLTW

Yacc

yacc 工具(之前通过运行 “go tool yacc” 获取)已被移除。 自 Go 1.7 起,它不再被 Go 编译器使用。 它已移至 “tools” 仓库,现在可在 golang.org/x/tools/cmd/goyacc 获取。

Fix

fix 工具新增了一个 “context” 修复程序,用于将导入从 “golang.org/x/net/context” 更改为 “context”。

Pprof

pprof 工具现在可以分析 TLS 服务器, 并可通过使用 “https+insecure” URL 模式跳过证书验证。

callgrind 输出现在具有指令级粒度。

Trace

trace 工具新增了一个 -pprof 标志,用于 从执行跟踪生成 pprof 兼容的阻塞和延迟分析文件。 垃圾回收事件在执行跟踪查看器中现在显示得更加清晰。垃圾回收活动会在其专属的行上显示,而GC(垃圾回收器)辅助协程(goroutine)则会标注其角色。

Vet

Vet在某些方面变得更严格,而在它之前容易导致误报的地方则变得宽松。

Vet 现在会检查:复制锁数组、重复的JSON和XML结构体(struct)字段标签、非空格分隔的结构体标签、在检查错误之前延迟调用HTTP Response.Body.Close,以及Printf中的索引参数。它也改进了现有的检查。

编译器工具链

Go 1.7为64位x86系统引入了一个新的编译器后端。在Go 1.8中,该后端得到了进一步开发,现在用于所有架构。

新的后端基于静态单赋值形式 (SSA),生成更紧凑、更高效的代码,并为诸如边界检查消除等优化提供了更好的平台。在32位ARM系统上,新后端使我们的基准测试程序的CPU时间减少了20-30%。对于在Go 1.7中已经使用SSA后端的64位x86系统,改进幅度则为更温和的0-10%。其他架构可能会看到接近32位ARM数字的改进。

Go 1.7中引入的用于禁用新后端的临时-ssa=0编译器标志已在Go 1.8中移除。

除了为所有系统启用新的编译器后端外,Go 1.8还引入了一个新的编译器前端。新的编译器前端对用户来说应该感觉不到变化,但它是未来性能工作的基础。

编译器和链接器在此版本中进行了优化,运行速度比Go 1.7更快,尽管它们仍然比我们期望的要慢,并且将在未来的版本中继续优化。与上一版本相比,Go 1.8的速度大约提高了15%

Cgo

Go工具现在会记住在make.bash期间设置的CGO_ENABLED环境变量的值,并默认将其应用于所有未来的编译,以修复问题#12808。在进行本地编译时,很少需要显式设置CGO_ENABLED环境变量,因为make.bash会自动检测正确的设置。显式设置CGO_ENABLED环境变量的主要原因是,当你的环境支持cgo,但你明确不希望cgo支持时,在这种情况下,请在make.bashall.bash期间设置CGO_ENABLED=0

现在可以使用环境变量PKG_CONFIG来设置处理#cgo pkg-config指令时要运行的程序。默认值是pkg-config,这是早期版本一直使用的程序。此更改旨在使交叉编译cgo代码更容易。

cgo工具现在支持一个-srcdir选项,该选项由go命令使用。

如果cgo代码调用C.malloc,而malloc返回NULL,程序现在会因内存不足错误而崩溃。C.malloc永远不会返回nil。与大多数C函数不同,C.malloc不能以返回errno值的双结果形式使用。

如果使用cgo调用一个C函数,并传递一个指向C联合体的指针,且如果该C联合体可以包含任何指针值,并且启用了cgo指针检查(默认启用),那么现在会检查该联合体值中是否包含Go指针。

Gccgo

由于Go的半年发行计划与GCC的年度发行计划对齐,GCC 6版本包含了Go 1.6.1版本的gccgo。我们预计下一个版本GCC 7将包含Go 1.8版本的gccgo。

默认GOPATH

如果未设置,GOPATH环境变量现在有一个默认值。它在Unix上默认为$HOME/go,在Windows上默认为%USERPROFILE%/go

Go get

go get 命令现在总是遵循HTTP代理环境变量,无论是否使用了-insecure标志。在之前的版本中,-insecure标志的副作用是不使用代理。

Go bug

新的go bug命令会在GitHub上开始一份错误报告,并预先填写了关于当前系统的信息。

Go doc

go doc命令现在将常量和变量与其类型分组显示,遵循godoc的行为。

为了提高doc输出的可读性,一级项目的每个摘要都保证占据一行。

现在可以请求接口定义中特定方法的文档,例如go doc net.Conn.SetDeadline

插件

Go现在提供了对插件的初步支持,包括一个用于生成用Go编写的插件的“plugin”构建模式,以及一个新的plugin包用于在运行时加载此类插件。插件支持目前仅在Linux上可用。请报告任何问题。

运行时

参数活跃性

垃圾回收器不再认为参数在整个函数期间都是活跃的。有关更多信息,以及如何强制保持变量的活跃状态,请参见Go 1.7中添加的runtime.KeepAlive函数。更新说明: 为已分配对象设置终结器的代码,可能需要在使用该对象的函数或方法中添加对 runtime.KeepAlive 的调用。 请阅读 KeepAlive 文档 及其示例以获取更多详情。

并发映射误用

在 Go 1.6 中,运行时 增加了对并发误用映射的轻量级、尽力检测。本次发布改进了该检测器,增加了对并发写入和迭代同一映射的程序的检测支持。

一如既往,如果一个 goroutine 正在写入一个映射,则其他任何 goroutine 都不应并发地读取(包括迭代)或写入该映射。 如果运行时检测到这种情况,它会打印诊断信息并使程序崩溃。 进一步了解问题的最佳方式是使用 竞态检测器 运行程序, 它将更可靠地识别竞态条件并提供更多细节。

MemStats 文档

runtime.MemStats 类型的文档已更加详尽。

性能

一如既往,变更范围广泛且多样,难以对性能做出精确陈述。 由于垃圾回收器的速度提升以及标准库中的优化,大多数程序的运行速度应该会略有提升。

以下包的实现已进行了优化: bytescrypto/aescrypto/ciphercrypto/ellipticcrypto/sha256crypto/sha512encoding/asn1encoding/csvencoding/hexencoding/jsonhash/crc32image/colorimage/drawmathmath/bigreflectregexpruntimestrconvstringssyscalltext/template 以及 unicode/utf8

垃圾回收器

垃圾回收暂停时间应该会比 Go 1.7 中显著缩短,通常低于 100 微秒,有时甚至低至 10 微秒。 详情请参阅 消除 Stop-the-World 栈重扫描的设计文档。 Go 1.9 将继续相关工作。

Defer

延迟函数调用 的开销已减少约一半。

Cgo

从 Go 调用 C 的开销已减少约一半。

标准库

示例

许多包的文档中已添加了示例。

Sort

sort 包现在包含一个便捷函数 Slice,用于根据给定的 less 函数对切片进行排序。 在许多情况下,这意味着无需再编写新的排序器类型。

另外还新增了 SliceStableSliceIsSorted

HTTP/2 Push

net/http 包现在包含一个机制,用于从 Handler 发送 HTTP/2 服务器推送。 类似于现有的 FlusherHijacker 接口,HTTP/2 ResponseWriter 现在实现了新的 Pusher 接口。

HTTP 服务器优雅关闭

HTTP 服务器现在支持使用新的 Server.Shutdown 方法进行优雅关闭,以及使用新的 Server.Close 方法进行立即关闭。

更多 Context 支持

延续 Go 1.7 采纳 context.Context 到标准库的趋势,Go 1.8 为现有包增加了更多上下文支持:

互斥锁争用分析

运行时和工具现在支持对争用的互斥锁进行分析。

大多数用户会希望在 “go test” 中使用新的 -mutexprofile 标志,然后对生成的文件使用 pprof

也可以通过新的 MutexProfileSetMutexProfileFraction 获取更低层级的支持。

Go 1.8 的一个已知限制是,该分析仅报告 sync.Mutex 的争用情况,不包括 sync.RWMutex

库的微小变更

一如既往,考虑到 Go 1 的兼容性承诺,库有各种微小的变更和更新。以下部分列出了对用户可见的更改和新增内容。优化和小错误修复未列出。

archive/tar

tar 的实现修复了文件格式边缘情况中的许多错误。 Reader 现在能够处理条目大于 8GB 的 PAX 格式的 tar 文件。 Writer 在某些涉及长路径名的情况下不再生成无效的 tar 文件。

compress/flate

编码器已有一些细微修复,以改善特定情况下的压缩比。因此,DEFLATE 的确切编码输出可能与 Go 1.7 不同。由于 DEFLATE 是 gzip、png、zlib 和 zip 的底层压缩格式,这些格式的输出可能也发生了变化。

当编码器在 NoCompression 模式下运行时,现在产生的输出是固定的,不再依赖于传递给 Write 方法的切片大小。

解码器在遇到错误时,现在会连同错误一起返回任何它已经解压的缓冲数据。

compress/gzip

Header.ModTime 字段为零值时,Writer 现在会编码一个零 MTIME 字段。在 Go 的先前版本中,Writer 会编码一个无意义的值。类似地,Reader 现在将编码值为零的 MTIME 字段报告为零 Header.ModTime

context

DeadlineExceeded 错误现在实现了 net.Error 接口,并且其 TimeoutTemporary 方法均返回 true。

crypto/tls

新方法 Conn.CloseWrite 允许 TLS 连接进行半关闭。

新方法 Config.Clone 克隆一个 TLS 配置。

新的 Config.GetConfigForClient 回调允许基于客户端的 ClientHelloInfo 动态选择配置。 ClientHelloInfo 结构体现在增加了新字段 ConnSignatureSchemes(使用新类型 SignatureScheme)、SupportedProtosSupportedVersions

新的 Config.GetClientCertificate 回调允许基于服务器的 TLS CertificateRequest 消息(由新的 CertificateRequestInfo 表示)选择客户端证书。

新的 Config.KeyLogWriter 允许在 WireShark 和类似工具中调试 TLS 连接。

新的 Config.VerifyPeerCertificate 回调允许对对等方呈现的证书进行额外验证。

crypto/tls 包现在实现了针对 CBC 填充 oracle 的基本对策。不应存在显式的依赖于秘密的时序,但它并不试图规范化内存访问以防止缓存时序泄漏。

crypto/tls 包现在支持 X25519 和 ChaCha20-Poly1305。 除非 存在硬件对 AES-GCM 的支持,否则 ChaCha20-Poly1305 现在被优先使用。

带有 SHA-256 的 AES-128-CBC 密码套件现在也受支持,但默认禁用。

crypto/x509

现在支持 PSS 签名。

UnknownAuthorityError 现在有一个 Cert 字段,报告不受信任的证书。

证书验证在少数情况下更宽松,在另一些情况下更严格。

在 Linux 上,根证书现在还会在 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem 路径下查找,以支持 RHEL 和 CentOS。

database/sql

该包现在支持 context.Context。有一些以 Context 结尾的新方法,如 DB.QueryContextDB.PrepareContext,这些方法接受上下文参数。使用新的 Context 方法可以确保在请求完成时关闭连接并将其返回到连接池;如果驱动程序支持,可以取消正在进行的查询;并允许数据库池取消等待下一个可用连接。

现在可以通过设置 TxOptions.Isolation 上的隔离级别,并将其传递给 DB.BeginTx,在开始事务时设置 IsolationLevel。如果选择了驱动程序不支持的隔离级别,将返回错误。还可以通过将 TxOptions.ReadOnly 设置为 true 来将事务设置为只读。

查询现在可以公开支持它的驱动程序的 SQL 列类型信息。行可以返回 ColumnTypes,其中可以包括 SQL 类型信息、列类型长度和 Go 类型。一个 Rows 现在可以表示多个结果集。在 Rows.Next 返回 false 后,可以调用 Rows.NextResultSet 以推进到下一个结果集。在推进到下一个结果集后,应继续使用现有的 Rows

NamedArg 可以用作查询参数。新函数 Named 有助于更简洁地创建 NamedArg

如果驱动程序支持新的 Pinger 接口,那么 DB.PingDB.PingContext 方法将使用该接口来检查数据库连接是否仍然有效。

新的 Context 查询方法适用于所有驱动程序,但 Context 取消操作不会立即响应,除非驱动程序已更新以使用它们。其他功能需要 database/sql/driver 中的驱动程序支持。驱动程序作者应查看新的接口。现有驱动程序的用户应查阅驱动程序文档以了解其支持的功能以及关于每项功能的系统特定文档。

debug/pe

该包已扩展,现在被 Go 链接器 用于读取 gcc 生成的目标文件。新的 File.StringTableSection.Relocs 字段提供对 COFF 字符串表和 COFF 重定位的访问。新的 File.COFFSymbols 允许对 COFF 符号表进行底层访问。

encoding/base64

新的 Encoding.Strict 方法返回一个 Encoding,当尾部填充位不为零时,会导致解码器返回错误。

encoding/binary

ReadWrite 现在支持布尔值。

encoding/json

UnmarshalTypeError 现在包含了结构体和字段名称。

一个 nil Marshaler 现在会被序列化为 JSON null 值。

一个 RawMessage 值现在序列化的方式与其指针类型相同。

Marshal 使用与 ES6 相同的格式编码浮点数,在更广泛的数值范围内优先使用十进制(非指数)表示法。特别是,所有不超过 264 的浮点整数格式与等效的 int64 表示相同。

在之前的 Go 版本中,将 JSON null 反序列化到 Unmarshaler 被视为无操作;现在 UnmarshalerUnmarshalJSON 方法会使用 JSON 字面量 null 调用,并且可以定义该情况的语义。

encoding/pem

Decode 现在对结束行的格式要求更严格。

encoding/xml

Unmarshal 现在支持使用新的 ",any,attr" 结构体标签来通配收集所有属性。

expvar

新方法 Int.ValueString.ValueFloat.ValueFunc.Value 报告导出变量的当前值。

新函数 Handler 返回该包的 HTTP 处理程序,以便将其安装在非标准位置。

fmt

ScanfFscanfSscanf 现在对空格的处理与之前的版本不同且更一致。详情请参阅 扫描文档

go/doc

新函数 IsPredeclared 报告一个字符串是否是预声明标识符。

go/types

新函数 Default 返回 “untyped” 类型的默认 “typed” 类型。

complex64 的对齐方式现在与 Go 编译器 匹配。

html/template

该包现在会验证 <script> 标签上的 "type" 属性。

image/png

Decode(和 DecodeConfig)现在支持真彩色和灰度透明度。

Encoder 在编码调色板图像时现在更快,并且生成的输出更小。

math/big

新方法 Int.Sqrt 计算 ⌊√x⌋。

新方法 Float.Scanfmt.Scanner 的支持例程。

Int.ModInverse 现在支持负数。

math/rand

新方法 Rand.Uint64 返回 uint64 值。新接口 Source64 描述能够直接生成此类值的源;否则,Rand.Uint64 方法将通过两次调用 SourceInt63 方法来构造一个 uint64

mime

ParseMediaType 函数现在会将不必要的反斜杠转义保留为字面字符,以便支持 MSIE。 当 MSIE 发送完整文件路径(在“intranet 模式”下)时,它不会转义反斜杠:"C:\dev\go\foo.txt",而不是 “C:\\dev\\go\\foo.txt"。 如果我们发现不必要的反斜杠转义,现在会假定它来自 MSIE 并且意在表示字面反斜杠。 已知的 MIME 生成器不会对数字和字母等简单标记字符产生不必要的反斜杠转义。

mime/quotedprintable

Reader 的解析在两方面有所放宽,以接受更多实际中遇到的输入。 首先,它接受一个不紧跟两个十六进制数字的等号(=),将其视为字面等号。 其次,它会静默忽略编码输入末尾多余的等号。

net

Conn 的文档已更新,以明确对接口实现的要求。net/http 包中的更新依赖于实现遵守文档规定。

更新: Conn 接口的实现者应验证其实现了文档所述的语义。 golang.org/x/net/nettest 包将对 Conn 进行测试并验证其行为是否正确。

新方法 UnixListener.SetUnlinkOnClose 设置当监听器关闭时,是否应从文件系统中移除底层的 socket 文件。

新的 Buffers 类型允许更高效地从内存中多个不连续的缓冲区写入网络。在某些机器上,对于某些类型的连接,这被优化为特定于操作系统的批量写入操作(例如 writev)。

新的 Resolver 用于查找名称和数字,并支持 context.ContextDialer 现在有一个可选的 Resolver 字段

Interfaces 现在在 Solaris 上受支持。

Go DNS 解析器现在支持 resolv.conf 的“rotate”和“option ndots:0”选项。“ndots”选项现在按照与 libresolve 相同的方式被尊重。

net/http

服务器端变更:

  • 服务器现在支持优雅关闭支持,如上所述
  • Server 添加了配置选项 ReadHeaderTimeoutIdleTimeout,并记录了 WriteTimeout
  • FileServerServeContent 现在除了之前对 If-None-Match 的支持外,还支持 HTTP If-Match 条件请求,前提是 ETags 根据 RFC 7232 第 2.3 节正确格式化。

服务器的 Handler 能力有多项新增:

  • Request.Context 返回的 Context 在底层 net.Conn 关闭时会被取消。例如,如果用户在一个慢速请求中途关闭浏览器,Handler 现在可以检测到用户已离开。这补充了现有的 CloseNotifier 支持。此功能要求底层的 net.Conn 实现了 最近澄清的接口文档
  • 要提供在头部已经写入后产生的 trailer,请参见新的 TrailerPrefix 机制。
  • Handler 现在可以通过使用错误 ErrAbortHandler 进行 panic 来中止响应。
  • ResponseWriter 写入零字节现在被定义为一种测试 ResponseWriter 是否已被劫持的方式:如果已被劫持,Write 将返回 ErrHijacked,并且不会向服务器的错误日志打印错误。

客户端与传输层变更:- Client 现在会在重定向时复制大多数请求头。详情请参阅 Client 类型的文档。

  • Transport 现在支持国际域名。因此,Get 和其他辅助函数也支持了。
  • Client 现在支持 301、307 和 308 重定向。例如,Client.Post 现在会遵循 301 重定向,将其转换为不带请求体的 GET 请求,就像之前处理 302 和 303 重定向响应那样。 Client 现在也会遵循 307 和 308 重定向,并保留原始的请求方法(如果有请求体也会保留)。如果重定向需要重新发送请求体,则请求必须定义新的 Request.GetBody 字段。 NewRequest 会为常见的请求体类型自动设置 Request.GetBody
  • Transport 现在会拒绝端口中包含非数字字符的 URL 请求。
  • Transport 现在会重试非幂等请求,条件是在网络故障前没有写入任何字节且请求没有请求体。
  • 新的 Transport.ProxyConnectHeader 允许在 CONNECT 请求期间配置发送给代理的头信息。
  • DefaultTransport.Dialer 现在启用了 DualStack("Happy Eyeballs")支持,允许在 IPv6 可能失败时使用 IPv4 作为备份。
  • Transport 不再读取非空 Request.Body 的一个字节来判断 Request.ContentLength 为零是实际为零还是未定义。要显式表示请求体长度为零,可以将其设置为 nil,或设置为新的值 NoBody。新的 NoBody 值旨在供 Request 构造函数使用;NewRequest 就使用了它。

net/http/httptrace

现在支持通过新的 ClientTrace.TLSHandshakeStartClientTrace.TLSHandshakeDone 来跟踪客户端请求的 TLS 握手过程。

net/http/httputil

ReverseProxy 新增了一个可选钩子 ModifyResponse, 用于在将后端响应代理给客户端之前对其进行修改。

net/mail

现在再次允许地址名称部分包含空的引号字符串。也就是说,Go 1.4 及更早版本接受 "" <gopher@example.com>,但 Go 1.5 引入了一个拒绝此地址的 bug。现在该地址再次被正确识别。

Header.Date 方法一直提供了解析 Date: 头信息的方法。新的 ParseDate 函数允许解析在其他头信息行中找到的日期,例如 Resent-Date: 头信息。

net/smtp

如果 Auth.Start 方法的实现返回空的 toServer 值,该包将不再在 SMTP AUTH 命令中发送尾随空格(这曾被一些服务器拒绝)。

net/url

新的函数 PathEscapePathUnescape 类似于查询字符串的转义和反转义函数,但用于路径元素。

新的方法 URL.HostnameURL.Port 返回 URL 的主机名和端口字段,并正确处理了端口可能不存在的情况。

现有的方法 URL.ResolveReference 现在能正确处理包含转义字节的路径,而不会丢失转义。

URL 类型现在实现了 encoding.BinaryMarshalerencoding.BinaryUnmarshaler, 使得在 gob 数据 中处理 URL 成为可能。

遵循 RFC 3986, Parse 现在会拒绝类似 this_that:other/thing 的 URL,而不是将其解释为相对路径(this_that 不是有效的协议方案)。要强制解释为相对路径,此类 URL 应以 “./” 为前缀。URL.String 方法现在会根据需要插入此前缀。

os

新的函数 Executable 返回正在运行的可执行文件的路径名。

尝试对已关闭的 os.File 调用方法现在将返回新的错误值 os.ErrClosed。之前它返回的是系统特定的错误,例如 syscall.EBADF

在 Unix 系统上,os.Rename 现在会返回错误,当它用于将一个目录重命名到一个已存在的空目录时。之前,重命名到非空目录会失败,但重命名到空目录会成功。这使得 Unix 上的行为与其他系统保持一致。 在 Windows 系统上,过长的绝对路径现在会被透明地转换为扩展长度路径(以 “\\?\” 开头的路径)。这使得该包能够处理路径名超过 260 个字符的文件。

在 Windows 系统上,os.IsExist 现在对系统错误 ERROR_DIR_NOT_EMPTY 会返回 true。这大致对应于现有对 Unix 错误 ENOTEMPTY 的处理方式。

在 Plan 9 系统上,未由 #M 提供服务的文件现在将在 FileInfo.Mode 返回的值中设置 ModeDevice 标志位。

path/filepath

修复了 Windows 上的一系列错误和边缘情况: Abs 现在会按文档所述调用 CleanGlob 现在能匹配 “\\?\c:\*", EvalSymlinks 现在能正确处理 “C:.",并且 Clean 现在能正确处理路径开头的 “.."。

reflect

新增了函数 Swapper 以支持 sort.Slice

strconv

Unquote 函数现在会移除原始字符串字面量(反引号括起来的字符串)中的回车符(\r),遵循 Go 语言规范

syscall

Getpagesize 现在返回系统实际的页面大小,而非一个常量值。之前它总是返回 4KB。

在 Solaris 系统上,Utimes 的函数签名已更改,以与其他所有 Unix 系统的签名保持一致。可移植的代码应继续改用 os.Chtimes

X__cmsg_data 字段已从 Cmsghdr 结构体中移除。

text/template

Template.Execute 现在可以接受一个 reflect.Value 作为其数据参数,并且 FuncMap 中的函数现在也可以接受和返回 reflect.Value

time

新增了函数 Until,作为现有 Since 函数的对应补充。

ParseDuration 现在接受更长的分数部分。

Parse 现在会拒绝月份开始之前的日期,例如 6 月 0 日;它之前已经拒绝超出月末的日期,例如 6 月 31 日和 7 月 32 日。

对于没有本地时区数据库的系统,tzdata 数据库已更新至 2016j 版本。

testing

新增了方法 T.Name(和 B.Name),用于返回当前测试或基准测试的名称。

新增了函数 CoverMode,用于报告测试覆盖率的模式。

如果启用了竞态检测器且在执行期间发生数据竞争,测试和基准测试现在会被标记为失败。之前,各个测试用例会显示为通过,只有测试二进制文件的整体执行会失败。

MainStart 函数的签名已按文档允许的方式更改。这是一个内部细节,并非 Go 1 兼容性承诺的一部分。如果你没有直接调用 MainStart 但看到错误,很可能意味着你设置了通常为空的 GOROOT 环境变量,且其值与你 go 命令二进制文件的版本不匹配。

unicode

SimpleFold 现在如果提供的输入是一个无效的 Unicode 码点,则会原样返回该参数。之前,其实现会因索引越界检查 panic 而失败。