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),这些机器实现了具有 FPU 或内核 FPU 模拟的 MIPS32r1 指令集。请注意,许多常见的基于 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

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 结构体字段标记、非空格分隔的结构体标记、在检查错误之前推迟对 HTTP Response.Body.Close 的调用以及 Printf 中的索引参数。它还改进了现有检查。

编译器工具链

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

新的后端基于 静态单赋值形式 (SSA),生成更紧凑、更高效的代码,并为优化(如边界检查消除)提供了更好的平台。新的后端将我们基准程序所需的 CPU 时间减少了 32 位 ARM 系统上的 20-30%。对于 64 位 x86 系统(在 Go 1.7 中已经使用 SSA 后端),收益更小,为 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 文档 及其示例以获取更多详细信息。

并发 Map 误用

在 Go 1.6 中,运行时 添加了轻量级的、尽力而为的并发误用 Map 检测。此版本通过支持检测并发写入和迭代 Map 的程序来改进该检测器。

与往常一样,如果一个 goroutine 正在写入 Map,则没有其他 goroutine 应该并发地读取(包括迭代)或写入 Map。如果运行时检测到这种情况,它将打印诊断信息并使程序崩溃。找出问题根源的最佳方法是在 竞态检测器 下运行程序,它将更可靠地识别竞态并提供更多详细信息。

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 微秒。有关详细信息,请参阅 关于消除停止世界堆栈重新扫描的文档。Go 1.9 还有更多工作要做。

延迟

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

Cgo

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

标准库

示例

已在许多软件包的文档中添加示例。

排序

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

新的函数还有 SliceStableSliceIsSorted

HTTP/2 推送

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

Writer 现在在 Header.ModTime 字段为零值时,会对零 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。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 方法可确保在请求完成后关闭连接并将其返回到连接池;在驱动程序支持的情况下,允许取消正在进行的查询;并允许数据库池取消等待下一个可用连接。

现在可以在启动事务时设置 IsolationLevel,方法是在 TxOptions.Isolation 上设置隔离级别,并将其传递给 DB.BeginTx。如果选择了驱动程序不支持的隔离级别,则会返回错误。也可以通过将 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 被认为是一个空操作;现在 `Unmarshaler` 的 `UnmarshalJSON` 方法被调用,传递 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` 方法会从两次调用 Source 的 `Int63` 方法来构造一个 `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

服务器更改

服务器的 `Handler` 可以执行的操作有几个新增

客户端和传输更改

net/http/httptrace

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

net/http/httputil

ReverseProxy 现在有一个新的可选钩子,ModifyResponse,用于在将响应代理到客户端之前修改来自后端的响应。

net/mail

地址名称部分现在再次允许空引号字符串。也就是说,Go 1.4 及更早版本接受 "" <[email protected]>,但 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 上的一些错误和边缘情况:Abs 现在按文档调用 CleanGlob 现在匹配“\\?\c:\*”,EvalSymlinks 现在可以正确处理“C:.”,并且 Clean 现在可以正确处理路径中的前导“..”。

reflect

添加了新的函数 Swapper 以支持 sort.Slice

strconv

Unquote 函数现在从反引号中的原始字符串中去除回车符 (\r),遵循 Go 语言语义

syscall

Getpagesize 现在返回系统的页大小,而不是常量值。以前它总是返回 4KB。

Utimes 的签名在 Solaris 上已更改,以匹配所有其他 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 现在在提供给定的输入是无效的 rune 时,将其参数保持不变。以前,实现会因索引边界检查恐慌而失败。