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 系统,已添加以下指令:VBROADCASTSD
、BROADCASTSS
、MOVDDUP
、MOVSHDUP
、MOVSLDUP
、VMOVDDUP
、VMOVSHDUP
和 VMOVSLDUP
。
对于 64 位 PPC 系统,已添加常用向量标量指令:LXS
、LXSDX
、LXSI
、LXSIWAX
、LXSIWZX
、LXV
、LXVD2X
、LXVDSX
、LXVW4X
、MFVSR
、MFVSRD
、MFVSRWZ
、MTVSR
、MTVSRD
、MTVSRWA
、MTVSRWZ
、STXS
、STXSDX
、STXSI
、STXSIWX
、STXV
、STXVD2X
、STXVW4X
、XSCV
、XSCVDPSP
、XSCVDPSPN
、XSCVDPSXDS
、XSCVDPSXWS
、XSCVDPUXDS
、XSCVDPUXWS
、XSCVSPDP
、XSCVSPDPN
、XSCVSXDDP
、XSCVSXDSP
、XSCVUXDDP
、XSCVUXDSP
、XSCVX
、XSCVXP
、XVCV
、XVCVDPSP
、XVCVDPSXDS
、XVCVDPSXWS
、XVCVDPUXDS
、XVCVDPUXWS
、XVCVSPDP
、XVCVSPSXDS
、XVCVSPSXWS
、XVCVSPUXDS
、XVCVSPUXWS
、XVCVSXDDP
、XVCVSXDSP
、XVCVSXWDP
、XVCVSXWSP
、XVCVUXDDP
、XVCVUXDSP
、XVCVUXWDP
、XVCVUXWSP
、XVCVX
、XVCVXP
、XXLAND
、XXLANDC
、XXLANDQ
、XXLEQV
、XXLNAND
、XXLNOR
、XXLOR
、XXLORC
、XXLORQ
、XXLXOR
、XXMRG
、XXMRGHW
、XXMRGLW
、XXPERM
、XXPERMDI
、XXSEL
、XXSI
、XXSLDWI
、XXSPLT
和 XXSPLTW
。
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.bash
或 all.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
类型已得到更全面的文档。
性能
一如既往,这些变化是如此普遍和多样,以至于很难对性能做出精确的陈述。由于垃圾回收器的加速和标准库中的优化,大多数程序应该运行得更快一些。
bytes
、crypto/aes
、crypto/cipher
、crypto/elliptic
、crypto/sha256
、crypto/sha512
、encoding/asn1
、encoding/csv
、encoding/hex
、encoding/json
、hash/crc32
、image/color
、image/draw
、math
、math/big
、reflect
、regexp
、runtime
、strconv
、strings
、syscall
、text/template
和 unicode/utf8
包中的实现已进行了优化。
垃圾回收器
垃圾回收暂停时间应显著短于 Go 1.7,通常在 100 微秒以下,并且常常低至 10 微秒。有关详细信息,请参阅关于消除停止世界栈重新扫描的文档。Go 1.9 还有更多工作要做。
Defer
延迟函数调用的开销已减少约一半。
Cgo
从 Go 到 C 的调用开销已减少约一半。
标准库
示例
许多包的文档中都添加了示例。
排序
sort 包现在包含一个便捷函数 Slice
,用于根据 less 函数对切片进行排序。在许多情况下,这意味着不再需要编写新的排序器类型。
同时新增了 SliceStable
和 SliceIsSorted
。
HTTP/2 Push
net/http 包现在包含一个机制,用于从 Handler
发送 HTTP/2 服务器推送。类似于现有的 Flusher
和 Hijacker
接口,HTTP/2 ResponseWriter
现在实现了新的 Pusher
接口。
HTTP 服务器优雅关闭
HTTP 服务器现在支持使用新的 Server.Shutdown
方法进行优雅关闭,以及使用新的 Server.Close
方法进行突然关闭。
更多上下文支持
延续 Go 1.7 将 context.Context
引入标准库的努力,Go 1.8 为现有包增加了更多上下文支持。
- 新的
Server.Shutdown
接受一个 context 参数。 - 在 database/sql 包中,对上下文支持有显著的添加。
- 新的
net.Resolver
上的所有九个新的Lookup
方法现在都接受一个 context。
互斥锁争用分析
运行时和工具现在支持分析争用的互斥锁。
大多数用户会希望使用 “go
test
” 的新 -mutexprofile
标志,然后对生成的文件使用 pprof。
较低级别的支持也可通过新的 MutexProfile
和 SetMutexProfileFraction
获得。
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
,并且对于 Timeout
和 Temporary
方法都报告 true。
crypto/tls
新方法 Conn.CloseWrite
允许 TLS 连接进行半关闭。
新方法 Config.Clone
克隆一个 TLS 配置。
新的 Config.GetConfigForClient
回调允许根据客户端的 ClientHelloInfo
动态选择客户端配置。ClientHelloInfo
结构体现在具有新字段 Conn
、SignatureSchemes
(使用新类型 SignatureScheme
)、SupportedProtos
和 SupportedVersions
。
新的 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.QueryContext
和 DB.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.Ping
和 DB.PingContext
方法将使用该接口检查数据库连接是否仍然有效。
新的 Context
查询方法适用于所有驱动程序,但只有在驱动程序更新以使用它们时,Context
取消才会有响应。其他功能需要 database/sql/driver
中的驱动程序支持。驱动程序作者应审查新的接口。现有驱动程序的用户应审查驱动程序文档,以了解它支持的功能以及每个功能的任何系统特定文档。
debug/pe
该包已扩展,现在由 Go 链接器用于读取 gcc
生成的目标文件。新的 File.StringTable
和 Section.Relocs
字段提供了对 COFF 字符串表和 COFF 重定位的访问。新的 File.COFFSymbols
允许对 COFF 符号表进行低级访问。
encoding/base64
新的 Encoding.Strict
方法返回一个 Encoding
,它使得解码器在尾随填充位不为零时返回错误。
encoding/binary
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.Value
、String.Value
、Float.Value
和 Func.Value
报告导出变量的当前值。
新函数 Handler
返回包的 HTTP 处理程序,以便将其安装到非标准位置。
fmt
Scanf
、Fscanf
和 Sscanf
现在与以前的版本相比,对空格的处理方式不同且更一致。有关详细信息,请参阅扫描文档。
go/doc
新的 IsPredeclared
函数报告字符串是否为预声明标识符。
go/types
新函数 Default
返回“无类型”类型的默认“有类型”类型。
complex64
的对齐现在与 Go 编译器匹配。
html/template
该包现在验证 <script>
标签上的 "type"
属性。
image/png
Decode
(和 DecodeConfig
)现在支持真彩色和灰度透明度。
Encoder
现在在编码调色板图像时更快,并创建更小的输出。
math/big
新方法 Int.Sqrt
计算 ⌊√x⌋。
新方法 Float.Scan
是 fmt.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.Context
。Dialer
现在有一个可选的 Resolver
字段。
Interfaces
现在在 Solaris 上受支持。
Go DNS 解析器现在支持 resolv.conf
的 “rotate
” 和 “option
ndots:0
” 选项。“ndots
” 选项现在以与 libresolve
相同的方式受到尊重。
net/http
服务器更改
- 服务器现在支持优雅关闭,如上文所述。
-
Server
增加了配置选项ReadHeaderTimeout
和IdleTimeout
,并记录了WriteTimeout
。 -
FileServer
和ServeContent
现在支持 HTTPIf-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
不再读取非 nilRequest.Body
的一个字节,以确定ContentLength
实际上是零还是未定义。要显式表示主体长度为零,请将其设置为nil
,或将其设置为新值NoBody
。新的NoBody
值旨在用于Request
构造函数;它由NewRequest
使用。
net/http/httptrace
现在支持使用新的 ClientTrace.TLSHandshakeStart
和 ClientTrace.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
新函数 PathEscape
和 PathUnescape
类似于查询转义和反转义函数,但用于路径元素。
新方法 URL.Hostname
和 URL.Port
返回 URL 的主机名和端口字段,正确处理端口可能不存在的情况。
现有方法 URL.ResolveReference
现在正确处理带有转义字节的路径,而不会丢失转义。
URL
类型现在实现了 encoding.BinaryMarshaler
和 encoding.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
现在按文档调用 Clean
,Glob
现在匹配 “\\?\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 而失败。