Go 1.8 Release Notes

Introduction to Go 1.8

最新的Go版本1.8版比Go 1.7版本晚了六个月. 它的大部分更改是在工具链,运行时和库的实现中进行的. 语言规范有两个小的更改 . 与往常一样,该发行版保留了Go 1 兼容性的承诺 . 我们希望几乎所有Go程序都能像以前一样继续编译和运行.

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

Changes to the language

从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位指数.

Ports

Go现在在Linux上支持大尾数计算机( linux/mips )和小尾数计算机( linux/mipsle )的32位MIPS,这些机器通过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或更高版本. 这可能是Go的最后一个支持10.8的版本. 未测试在旧版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". 然后系统实现ARMv6K或更高版本. 在非Linux ARM系统上运行已经需要ARMv6K或更高版本.

Known Issues

FreeBSD和NetBSD上存在一些已知但不了解的不稳定性. 在极少数情况下,这可能导致程序崩溃. 请参阅问题15658问题16511 . 解决这些问题的任何帮助将不胜感激.

Tools

Assembler

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

对于64位PPC系统中,常见的矢量标量指令已被添加: LXSLXSDXLXSILXSIWAXLXSIWZXLXVLXVD2XLXVDSXLXVW4XMFVSRMFVSRDMFVSRWZMTVSRMTVSRDMTVSRWAMTVSRWZSTXSSTXSDXSTXSISTXSIWXSTXVSTXVD2XSTXVW4XXSCVXSCVDPSPXSCVDPSPNXSCVDPSXDSXSCVDPSXWSXSCVDPUXDSXSCVDPUXWSXSCVSPDPXSCVSPDPNXSCVSXDDPXSCVSXDSPXSCVUXDDPXSCVUXDSPXSCVXXSCVXPXVCVXVCVDPSPXVCVDPSXDSXVCVDPSXWSXVCVDPUXDSXVCVDPUXWSXVCVSPDPXVCVSPSXDSXVCVSPSXWSXVCVSPUXDSXVCVSPUXWSXVCVSXDDPXVCVSXDSPXVCVSXWDPXVCVSXWSPXVCVUXDDPXVCVUXDSPXVCVUXWDPXVCVUXWSPXVCVXXVCVXPXXLANDXXLANDCXXLANDQXXLEQVXXLNANDXXLNORXXLORXXLORCXXLORQXXLXORXXMRGXXMRGHWXXMRGLWXXPERMXXPERMDIXXSELXXSIXXSLDWIXXSPLTXXSPLTW .

Yacc

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

Fix

fix工具具有新的" context "修复程序,可将导入从" golang.org/x/net/context "更改为" context ".

Pprof

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

现在,callgrind输出具有指令级的粒度.

Trace

trace工具具有一个新的-pprof标志,用于从执行跟踪中生成与pprof兼容的阻止和等待时间配置文件.

现在,垃圾收集事件在执行跟踪查看器中更清晰地显示. 垃圾收集活动显示在其自己的行上,并且GC帮助程序goroutine带有其角色进行注释.

Vet

兽医在某些方面更严格,而以前曾引起误报的地方则更为宽松.

现在,Vet会检查复制的锁数组,重复的JSON和XML结构字段标签,非空格分隔的结构标签,在检查错误之前对HTTP Response.Body.Close延迟调用,以及检查Printf索引参数. 它还可以改善现有检查.

Compiler Toolchain

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.8中已删除了Go 1.7中引入的临时-ssa=0编译器标记以禁用新后端.

In addition to enabling the new compiler back end for all systems, Go 1.8 also introduces a new compiler front end. The new compiler front end should not be noticeable to users but is the foundation for future performance work.

与Go 1.7相比,此版本中的编译器和链接器已经过优化和运行,但仍比我们期望的慢,并且在以后的版本中将继续进行优化. 与以前的版本相比,Go 1.8的速度提高了约15% .

Cgo

现在转到工具记住的价值CGO_ENABLED期间环境变量设置make.bash ,它适用于所有默认今后的编译来修复问题#12808 . 在进行本机编译时,几乎不需要显式设置CGO_ENABLED环境变量,因为make.bash将自动检测到正确的设置. 显式设置CGO_ENABLED环境变量的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指针检查 (默认情况下),则现在检查联合值去指针.

Gccgo

由于Go的半年发布计划与GCC的年度发布计划保持一致,因此GCC第6版包含gccgo的Go 1.6.1版本. 我们希望下一个版本GCC 7将包含Go 1.8版本的gccgo.

Default GOPATH

现在,如果未设置GOPATH环境变量,则具有默认值. 在Unix上默认为$HOME/go ,在Windows上默认为%USERPROFILE%/go .

Go get

The “go get” command now always respects HTTP proxy environment variables, regardless of whether the -insecure flag is used. In previous releases, the -insecure flag had the side effect of not using proxies.

Go bug

新的" go bug "命令在GitHub上启动一个错误报告,并预先填充了有关当前系统的信息.

Go doc

现在," go doc "命令按照godoc的行为将常量和变量及其类型godoc .

为了提高doc输出的可读性,请确保第一级项目的每个摘要都占用一行.

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

Plugins

现在,Go通过" plugin "构建模式(用于生成用Go编写的插件)提供了对插件的早期支持,并提供了一个新的plugin包,用于在运行时加载此类插件. 当前仅在Linux上提供插件支持. 请报告任何问题.

Runtime

Argument Liveness

垃圾收集器不再认为参数在整个函数中都有效. 有关更多信息以及如何强制变量保持活动状态,请参阅Go 1.7中添加的runtime.KeepAlive函数.

Code that sets a finalizer on an allocated object may need to add calls to runtime.KeepAlive in functions or methods using that object. 在分配的对象上设置终结器的代码可能需要添加对runtime.KeepAlive调用runtime.KeepAlive使用该对象的函数或方法中. 阅读KeepAlive文档及其示例以获取更多详细信息.

Concurrent Map Misuse

在Go 1.6中,运行时添加了轻量级的尽力检测并发滥用map的功能 . 此版本改进了该检测器,并支持检测同时写入到地图和在地图上进行迭代的程序.

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

MemStats Documentation

runtime.MemStats类型已被更详尽地记录.

Performance

与往常一样,这些更改是如此笼统和多变,以至于很难对性能进行精确的表述. 由于垃圾收集器的加速和标准库的优化,大多数程序应运行得更快.

There have been optimizations to implementations in the 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, and unicode/utf8 packages.

Garbage Collector

垃圾收集的停顿时间应比Go 1.7中的停顿时间短得多,通常在100微秒以下,通常低至10微秒. 有关详细信息,请参阅有关消除停产的堆栈重新扫描文档 . Go 1.9还有更多工作要做.

Defer

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

Cgo

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

Standard library

Examples

在许多软件包中,示例已添加到文档中.

Sort

现在, sort包包括一个便捷函数Slice用于对功能较少的 Slice进行排序. 在许多情况下,这意味着无需编写新的分类器类型.

SliceStableSliceIsSorted也很新.

HTTP/2 Push

net / http软件包现在包括一种从Handler发送HTTP / 2服务器推送的机制. 与现有的FlusherHijacker接口类似,HTTP / 2 ResponseWriter现在实现了新的Pusher接口.

HTTP Server Graceful Shutdown

现在,HTTP Server支持使用新的Server.Shutdown方法正常关机,以及使用新的Server.Close方法突然关机.

More Context Support

继续使用Go 1.7的 context.Context进入标准库,Go 1.8为现有软件包增加了更多上下文支持:

Mutex Contention Profiling

现在,运行时和工具支持对竞争的互斥进行概要分析.

Most users will want to use the new -mutexprofile flag with “go test”, and then use pprof on the resultant file.

也可以通过新的MutexProfileSetMutexProfileFraction获得较低级别的支持.

Go 1.8的一个已知限制是,配置文件仅报告sync.Mutex争用,而不报告sync.RWMutex争用.

Minor changes to the library

As always, there are various minor changes and updates to the library, made with the Go 1 promise of compatibility in mind. The following sections list the user visible changes and additions. Optimizations and minor bug fixes are not listed.

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字段为零值时, WriterMTIME字段编码为零. 在Go的Writer版本中, 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表示)选择客户端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.PrepareContextDB.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 .

If a driver supports the new Pinger interface, the DB.Ping and DB.PingContext methods will use that interface to check whether a database connection is still valid.

新的Context查询方法适用于所有驱动程序,但是除非已更新驱动程序以使用它们,否则Context取消不会响应. 其他功能需要在database/sql/driver提供驱动程序支持. 驱动程序作者应查看新界面. 现有驱动程序的用户应查看驱动程序文档,以了解其支持的功能以及每个功能的系统特定的文档.

debug/pe

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

encoding/base64

新的Encoding.Strict方法返回一个Encoding ,当尾随填充位不为零时,该Encoding使解码器返回错误.

encoding/binary

ReadWrite现在支持布尔值.

encoding/json

UnmarshalTypeError现在包括结构和字段名称.

现在,一个零Marshaler为JSON null值.

现在, RawMessage值将与其指针类型一起编组.

Marshal使用与ES6中相同的格式对浮点数进行编码,对于更广泛的值范围更喜欢使用十进制(非指数)表示法. 特别是,所有不超过2 64的浮点整数的格式都与等效的int64表示形式相同.

在Go的早期版本中,将JSON null UnmarshalerUnmarshaler被视为无操作. 现在, UnmarshalerUnmarshalJSON方法以JSON常量null调用,并且可以定义这种情况的语义.

encoding/pem

Decode现在对结束行的格式非常严格.

encoding/xml

Unmarshal现在具有通配符支持,可以使用新的",any,attr"结构标签来收集所有属性.

expvar

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

新功能Handler返回程序包的HTTP处理程序,以将其安装在非标准位置.

fmt

Scanf, Fscanf, and Sscanf now handle spaces differently and more consistently than previous releases. See the scanning documentation for details.

go/doc

新的IsPredeclared函数报告字符串是否是预声明的标识符.

go/types

新函数Default返回默认的" typed"类型为" untyped"类型.

现在, 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方法构造一个uint64从两次调用SourceInt63方法.

mime

现在, ParseMediaType将多余的反斜杠转义保留为文字,以支持MSIE. 当MSIE发送完整的文件路径(在"内部网模式"下)时,它不会转义反斜杠:" C:\dev\go\foo.txt ",而不是" C:\\dev\\go\\foo.txt " . 如果我们看到不必要的反斜杠转义,我们现在假设它来自MSIE,并打算用作文字反斜杠. 没有已知的MIME生成器为简单的令牌字符(例如数字和字母)发出不必要的反斜杠转义符.

mime/quotedprintable

Reader的解析已通过两种方式放宽,以接受更多野外看到的输入. 首先,它接受等号( = ),后跟两个十六进制数字作为文字等号. 其次,它默默地忽略了编码输入末尾的等号.

net

Conn文档已更新,以阐明对接口实现的期望. net/http软件包中的更新取决于遵循文档的实现.

implementations of the Conn interface should verify they implement the documented semantics. Conn接口的实现应验证它们是否实现了已记录的语义. golang.org/x/net/nettest软件包将使用Conn并验证其行为是否正确.

新方法UnixListener.SetUnlinkOnClose设置在关闭侦听器时是否应从文件系统中删除底层套接字文件.

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

新的Resolver查找名称和数字,并支持context.Context . Dialer现在具有一个可选的" Resolver字段 .

Solaris现在支持Interfaces .

Go DNS解析器现在支持resolv.conf的" rotate "和" option ndots:0 "选项. 现在,以与libresolve相同的方式使用" ndots "选项.

net/http

服务器更改:

  • 服务器现在支持上述平稳关闭支持.
  • Server添加配置选项ReadHeaderTimeoutIdleTimeout并记录WriteTimeout .
  • 除了以前对根据RFC 7232第2.3节正确设置格式的ETag的If-None-Match支持之外, FileServerServeContent现在还支持HTTP If-Match条件请求.

服务器的Handler可以做什么呢?

  • 如果基础net.Conn关闭,则Request.Context返回的Context被取消. 例如,如果用户在缓慢的请求过程中关闭了浏览器,则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 (" 快乐眼球 ")支持,如果看起来像IPv6可能失败,则允许将IPv4用作备份.
  • Request.ContentLength为零时, Transport不再读取非null 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:标题)中找到Resent-Date: .

net/smtp

如果Auth.Start方法的实现返回空的toServer值,则程序包将不再在SMTP AUTH命令中发送尾随空格,某些服务器拒绝了该空格.

net/url

The new functions PathEscape and PathUnescape are similar to the query escaping and unescaping functions but for path elements.

新方法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返回正在运行的可执行Executable的路径名.

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

在Unix系统上,当用于将目录重命名为现有的空目录时, os.Rename现在将返回错误. 以前,在重命名为非空目录时会失败,而在重命名为空目录时会成功. 这使得Unix上的行为与其他系统相对应.

在Windows上,现在可以将长的绝对路径透明转换为扩展长度的路径(以" \\?\ "开头的路径). 这使程序包可以处理路径名超过260个字符的文件.

在Windows中, os.IsExist将现在回到true的系统错误ERROR_DIR_NOT_EMPTY . 这大致对应于Unix错误ENOTEMPTY的现有处理.

在Plan 9,不是由提供服务的文件#M现在将有ModeDevice在返回的值设定FileInfo.Mode .

path/filepath

A number of bugs and corner cases on Windows were fixed: Abs now calls Clean as documented, Glob now matches “\\?\c:\*”, EvalSymlinks now correctly handles “C:.”, and Clean now properly handles a leading “..” in the path.

reflect

添加了新功能Swapper以支持sort.Slice .

strconv

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

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不变地返回其参数. 以前,实现因索引范围检查恐慌而失败.

by  ICOPY.SITE