Go 1.8 发行说明

Go 1.8 简介

最新的 Go 版本 1.8,在 Go 1.7 发布六个月后推出。其大部分更改都在工具链、运行时和库的实现中。语言规范有两处微小更改。一如既往,此版本保持了 Go 1 的兼容性承诺。我们预计几乎所有 Go 程序都将像以前一样继续编译和运行。

此版本增加了对 32 位 MIPS 的支持更新了编译器后端以生成更高效的代码,通过消除停止世界的堆栈重新扫描来减少 GC 暂停增加了 HTTP/2 Push 支持增加了 HTTP 优雅关机增加了更多上下文支持启用了互斥锁分析,并简化了切片排序

语言变化

当显式地将一个结构类型的值转换为另一个结构类型时,从 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) // now legal
}

语言规范现在仅要求实现支持浮点常量中最多 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 将是最后一个支持 ARMv5E 和 ARMv6 处理器上 Linux 的版本: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 上存在一些已知但未解决的不稳定性。这些可能在极少数情况下导致程序崩溃。请参阅问题 15658问题 16511。任何解决这些问题的帮助都将不胜感激。

工具

汇编器

对于 64 位 x86 系统,已添加以下指令:VBROADCASTSDBROADCASTSSMOVDDUPMOVSHDUPMOVSLDUPVMOVDDUPVMOVSHDUPVMOVSLDUP

对于 64 位 PPC 系统,已添加常用向量标量指令:LXSLXSDXLXSILXSIWAXLXSIWZXLXVLXVD2XLXVDSXLXVW4XMFVSRMFVSRDMFVSRWZMTVSRMTVSRDMTVSRWAMTVSRWZSTXSSTXSDXSTXSISTXSIWXSTXVSTXVD2XSTXVW4XXSCVXSCVDPSPXSCVDPSPNXSCVDPSXDSXSCVDPSXWSXSCVDPUXDSXSCVDPUXWSXSCVSPDPXSCVSPDPNXSCVSXDDPXSCVSXDSPXSCVUXDDPXSCVUXDSPXSCVXXSCVXPXVCVXVCVDPSPXVCVDPSXDSXVCVDPSXWSXVCVDPUXDSXVCVDPUXWSXVCVSPDPXVCVSPSXDSXVCVSPSXWSXVCVSPUXDSXVCVSPUXWSXVCVSXDDPXVCVSXDSPXVCVSXWDPXVCVSXWSPXVCVUXDDPXVCVUXDSPXVCVUXWDPXVCVUXWSPXVCVXXVCVXPXXLANDXXLANDCXXLANDQXXLEQVXXLNANDXXLNORXXLORXXLORCXXLORQXXLXORXXMRGXXMRGHWXXMRGLWXXPERMXXPERMDIXXSELXXSIXXSLDWIXXSPLTXXSPLTW

Yacc

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

修复

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

Pprof

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

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

Trace

trace 工具有一个新的 -pprof 标志,用于从执行跟踪生成与 pprof 兼容的阻塞和延迟配置文件。

垃圾回收事件现在在执行跟踪查看器中显示得更清晰。垃圾回收活动显示在其自己的行上,并且 GC 助手 goroutine 被标注了其角色。

Vet

Vet 在某些方面更严格,而在以前导致误报的地方则更宽松。

Vet 现在检查锁数组的复制、重复的 JSON 和 XML 结构字段标签、非空格分隔的结构标签、在检查错误之前对 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/templateunicode/utf8 包中的实现已进行了优化。

垃圾回收器

垃圾回收暂停时间应显著短于 Go 1.7,通常在 100 微秒以下,并且常常低至 10 微秒。有关详细信息,请参阅关于消除停止世界栈重新扫描的文档。Go 1.9 还有更多工作要做。

Defer

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

Cgo

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

标准库

示例

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

排序

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

同时新增了 SliceStableSliceIsSorted

HTTP/2 Push

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

HTTP 服务器优雅关闭

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

更多上下文支持

延续 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 现在能够处理 PAX 格式的 tar 文件,其中条目大小超过 8GB。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 填充预言机的基本对策。应该没有明确的秘密相关计时,但它不尝试规范内存访问以防止缓存计时泄漏。

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

现在还支持带有 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 参数。使用新的 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 返回“无类型”类型的默认“有类型”类型。

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 发送完整文件路径(在“内部网模式”下)时,它不会转义反斜杠:“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 设置当监听器关闭时,底层套接字文件是否应从文件系统中移除。

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

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

Interfaces 现在在 Solaris 上受支持。

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

net/http

服务器更改

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

服务器的 Handler 可以执行的功能有几项新增:

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

客户端和传输更改

  • Client 现在会在重定向时复制大多数请求头。有关详细信息,请参阅 Client 类型文档
  • Transport 现在支持国际域名。因此,Get 和其他辅助函数也支持。
  • 客户端现在支持 301、307 和 308 重定向。例如,Client.Post 现在遵循 301 重定向,将其转换为不带主体的 GET 请求,就像以前处理 302 和 303 重定向响应一样。客户端现在还遵循 307 和 308 重定向,保留原始请求方法和主体(如果有)。如果重定向需要重新发送请求主体,则请求必须定义新的 Request.GetBody 字段。NewRequest 会自动为常见主体类型设置 Request.GetBody
  • Transport 现在拒绝端口中包含非数字字符的 URL 请求。
  • 如果网络故障发生前未写入任何字节且请求没有主体,则 Transport 现在将重试非幂等请求。
  • 新的 Transport.ProxyConnectHeader 允许配置在 CONNECT 请求期间发送给代理的头值。
  • DefaultTransport.Dialer 现在启用 DualStack(“Happy Eyeballs”)支持,允许在 IPv6 可能失败时使用 IPv4 作为备用。
  • Request.ContentLength 为零时,Transport 不再读取非 nil Request.Body 的一个字节,以确定 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 引入了一个错误,拒绝了此地址。该地址再次被识别。

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 上的一些 bug 和边缘情况: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

如果提供的输入是无效的 rune,SimpleFold 现在返回其参数不变。以前,该实现会因索引越界检查 panic 而失败。