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 系统,已添加以下指令: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
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.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
” 构建模式,以及用于在运行时加载此类插件的新
包。插件支持目前仅在 Linux 上可用。请报告任何问题。plugin
运行时
参数活性
垃圾收集器不再认为函数整个执行过程中参数都是存活的。有关更多信息以及如何强制变量保持存活,请参阅 Go 1.7 中添加的 runtime.KeepAlive
函数。
更新:在分配的对象上设置终结器的代码可能需要在使用该对象的函数或方法中添加对 runtime.KeepAlive
的调用。阅读 KeepAlive
文档 及其示例以获取更多详细信息。
并发 Map 误用
在 Go 1.6 中,运行时 添加了轻量级的、尽力而为的并发误用 Map 检测。此版本通过支持检测并发写入和迭代 Map 的程序来改进该检测器。
与往常一样,如果一个 goroutine 正在写入 Map,则没有其他 goroutine 应该并发地读取(包括迭代)或写入 Map。如果运行时检测到这种情况,它将打印诊断信息并使程序崩溃。找出问题根源的最佳方法是在 竞态检测器 下运行程序,它将更可靠地识别竞态并提供更多详细信息。
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 还有更多工作要做。
延迟
延迟函数调用 的开销减少了大约一半。
Cgo
从 Go 到 C 的调用开销减少了大约一半。
标准库
示例
已在许多软件包的文档中添加示例。
排序
sort
包现在包含一个便利函数 Slice
,用于根据 小于 函数对切片进行排序。在许多情况下,这意味着编写新的排序器类型是不必要的。
新的函数还有 SliceStable
和 SliceIsSorted
。
HTTP/2 推送
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
方法接受上下文参数。 database/sql
包已进行了 重大添加,其中包含上下文支持。- 新的
net.Resolver
上的所有 9 个新的Lookup
方法现在都接受上下文。
互斥锁争用分析
运行时和工具现在支持分析有争用互斥锁。
大多数用户会希望在 “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
Writer
现在在 Header.ModTime
字段为零值时,会对零 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。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
方法可确保在请求完成后关闭连接并将其返回到连接池;在驱动程序支持的情况下,允许取消正在进行的查询;并允许数据库池取消等待下一个可用连接。
现在可以在启动事务时设置 IsolationLevel
,方法是在 TxOptions.Isolation
上设置隔离级别,并将其传递给 DB.BeginTx
。如果选择了驱动程序不支持的隔离级别,则会返回错误。也可以通过将 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
现在除了之前对符合 RFC 7232 第 2.3 节的 ETag 的 `If-None-Match` 支持之外,还支持 HTTP `If-Match` 条件请求。
服务器的 `Handler` 可以执行的操作有几个新增
-
由
Request.Context
返回的Context
如果底层 `net.Conn` 关闭,则会被取消。例如,如果用户在缓慢的请求中途关闭了他们的浏览器,`Handler` 现在可以检测到用户已离开。这补充了现有的CloseNotifier
支持。此功能需要底层net.Conn
实现 最近澄清的接口文档。 -
要服务在标题已写入后产生的尾部,请参阅新的
TrailerPrefix
机制。 -
一个 `Handler` 现在可以通过使用错误
ErrAbortHandler
抛出异常来中止响应。 -
对
ResponseWriter
的零字节 `Write` 现在被定义为一种测试 `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”)支持,允许使用 IPv4 作为备用,如果看起来 IPv6 可能失败。 -
Transport
不再读取非 `nil` 的Request.Body
的一个字节,当Request.ContentLength
为零时,以确定 `ContentLength` 实际上是否为零,还是仅未定义。要明确地表明正文长度为零,请将其设置为 `nil`,或将其设置为新的值NoBody
。新的 `NoBody` 值 предназначен для использования функциями-конструкторами `Request`;它由NewRequest
使用。
net/http/httptrace
现在支持使用新的 ClientTrace.TLSHandshakeStart
和 ClientTrace.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
新的函数 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 上的一些错误和边缘情况:Abs
现在按文档调用 Clean
,Glob
现在匹配“\\?\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 时,将其参数保持不变。以前,实现会因索引边界检查恐慌而失败。