Go 1.7 Release Notes

Introduction to Go 1.7

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

该发行版为IBM LinuxOne添加了一个端口更新x86-64编译器后端以生成更有效的代码; 包括上下文包 ,该上下文包是x / net子存储库升级而来的,现在已在标准库中使用; 并在测试包中添加了对创建测试和基准层次结构的支持 . 该版本还最终确定了从Go 1.5开始的供应商支持 ,使其成为标准功能.

Changes to the language

此版本中仅发生了一次微小的语言更改. 关于终止语句的部分阐明,要确定语句列表是否以终止语句结尾,则将"最终非空语句"视为末尾,以匹配gc和gccgo编译器工具链的现有行为. 在较早的版本中,该定义仅涉及"最终声明",因此至少不明确尾随空声明的影响. 在这方面, go/types包已更新,以匹配gc和gccgo编译器工具链. 此更改对现有程序的正确性没有影响.

Ports

Go 1.7添加了对macOS 10.12 Sierra的支持. 使用Go 1.7之前的版本构建的二进制文件无法在Sierra上正常工作.

Go 1.7 在z Systems上的Linuxlinux/s390x添加了一个实验端口,在ARM上的Plan 9上添加了端口的开头( plan9/arm ).

The experimental ports to Linux on 64-bit MIPS (linux/mips64 and linux/mips64le) added in Go 1.6 now have full support for cgo and external linking.

小端64位PowerPC( linux/ppc64le )上的Linux实验端口现在需要POWER8架构或更高版本. 大端64位PowerPC( linux/ppc64 )仅需要POWER5体系结构.

现在,OpenBSD端口需要OpenBSD 5.6或更高版本,才能访问 (2)系统调用.

Known Issues

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

Tools

Assembler

对于64位ARM系统,向量寄存器名称已更正为V0V31 . 以前的版本错误地将它们称为V32V63 .

对于64位x86系统,下面的说明已被添加: PCMPESTRIRORXLRORXQVINSERTI128VPADDDVPADDQVPALIGNRVPBLENDDVPERM2F128VPERM2I128VPORVPSHUFBVPSHUFDVPSLLDVPSLLDQVPSLLQVPSRLDVPSRLDQ ,和VPSRLQ .

Compiler Toolchain

This release includes a new code generation back end for 64-bit x86 systems, following a proposal from 2015 that has been under development since then. The new back end, based on SSA, generates more compact, more efficient code and provides a better platform for optimizations such as bounds check elimination. The new back end reduces the CPU time required by our benchmark programs by 5-35%.

对于此发行版,可以通过将-ssa=0传递给编译器来禁用新的后端. 如果您发现您的程序仅在禁用了新的后端的情况下才能编译或成功运行,请提交错误报告 .

编译器在程序包归档中写入的导出元数据的格式已更改:旧的文本格式已由更紧凑的二进制格式代替. 这样可以减少软件包的存档,并修复一些长期存在的案例错误.

对于此版本,可以通过将-newexport=0传递给编译器来禁用新的导出格式. 如果您发现您的程序仅在禁用了新导出格式的情况下才能编译或成功运行,请提交错误报告 .

链接器的-X选项不再支持不寻常的两参数形式-X name value ,如Go 1.6发行版和链接器打印的警告中所宣布 . 使用-X name=value代替.

与Go 1.6相比,此版本中的编译器和链接器已经过优化和运行,但是运行速度比我们期望的要慢,并且在以后的发行版中将继续进行优化.

由于编译器工具链和标准库的变化,使用此版本构建的二进制文件通常应比使用Go 1.6构建的二进制文件小一些,有时多达20%到30%.

在x86-64系统上,Go程序现在可以像Linux的perf和Intel的VTune之类的性能分析工具所期望的那样维护堆栈框架指针,从而使使用这些工具分析和优化Go程序更加容易. 帧指针维护的运行时开销很小,虽然有所不同,但平均约为2%. 我们希望在将来的发行版中降低此成本. 要构建不使用框架指针的工具链, GOEXPERIMENT=noframepointer在运行make.bashmake.batmake.rc时设置GOEXPERIMENT=noframepointer make.rc .

Cgo

尽管Go绑定仍必须使用C语言API,但是使用cgo的软件包现在可能包括Fortran源文件(除了C,C ++,Objective C和SWIG).

Go绑定现在可以使用新的辅助函数C.CBytes . 在对比C.CString ,这需要一个围棋string ,并返回一个*C.byte (一个C char* ), C.CBytes需要转到[]byte并且返回一个unsafe.Pointer (一个C void* ).

在过去的发行版中,由于嵌入了临时目录名称,因此使用cgo生成的软件包和二进制文件在每个版本上都产生了不同的输出. 当将此版本与足够新的GCC或Clang版本(支持-fdebug-prefix-map选项的版本)一起使用时,这些构建最终应该是确定性的.

Gccgo

由于Go的半年发布计划与GCC的年度发布计划保持一致,因此GCC第6版包含gccgo的Go 1.6.1版本. 下一个版本GCC 7可能会带有Go 1.8版本的gccgo.

Go command

go命令的基本操作未更改,但是有许多更改值得注意.

如Go 1.6版本中所宣布的 ,此版本删除了对GO15VENDOREXPERIMENT环境变量的支持. 现在, 供应商支持go命令和工具链的标准功能.

可用于" go list "的Package数据结构现在包括一个StaleReason字段,该字段解释了为什么某个包被视为过时或不被视为过时(需要重建). 该字段可用于-f-json选项,对于理解为什么要重建目标很有用.

现在," go get "命令支持引用git.openstack.org导入路径.

此发行版增加了对使用二进制包构建程序的实验性最小支持,这些程序以二进制形式分发,而没有相应的源代码. 在某些商业设置中需要此功能,但并不打算将其完全集成到其他工具链中. 例如,假定可以访问完整源代码的工具将不适用于此类软件包,并且" go get "命令中没有计划支持此类软件包.

Go doc

现在," go doc "命令将构造函数按照其构造的类型进行分组,紧跟在godoc .

Go vet

" go vet "命令的-copylock-printf检查,以及新的-tests检查,可以检查可能的测试功能的名称和签名,从而可以进行更准确的分析. 为了避免混淆与新-tests检查,老的,未公开的-test选项已被删除; 它等同于-all -shadow .

vet命令还具有一个新的检查-lostcancel ,它检测到未能调用Go 1.7的新context包中的WithCancelWithTimeoutWithDeadline函数返回的取消函数(请参见下文 ). 未能调用该函数会阻止在取消其父级之前回收新的Context . (背景上下文永远不会被取消.)

Go tool dist

新的子命令" go tool dist list "打印所有受支持的操作系统/体系结构对.

Go tool trace

Go 1.5中引入的" go tool trace "命令已通过多种方式进行了改进.

首先,与以前的版本相比,收集跟踪的效率明显更高. 在此版本中,收集跟踪的典型执行时间开销约为25%; 在过去的版本中,该比例至少为400%. 其次,跟踪文件现在包含文件和行号信息,这使它们更加独立,并在运行跟踪工具时使原始可执行文件成为可选文件. 第三,跟踪工具现在可以分解较大的跟踪,以避免基于浏览器的查看器受到限制.

尽管此版本中的跟踪文件格式已更改,但是Go 1.7工具仍可以读取早期版本中的跟踪.

Performance

与往常一样,这些更改是如此笼统和多变,以至于很难对性能进行精确的表述. 由于垃圾收集器的加速和核心库的优化,大多数程序的运行速度应稍快一些. 在x86-64系统上,由于新的编译器后端带来的生成代码的改进,许多程序的运行速度将显着提高. 如上所述,在我们自己的基准测试中,仅代码生成更改通常会减少程序CPU时间5-35%.

进行了重大的优化,对crypto/sha1crypto/sha256encoding/binaryfmthash/adler32hash/crc32hash/crc64image/colormath/bigstrconv实现带来了超过10%的实现改进, stringsunicodeunicode/utf16软件包.

Garbage collection pauses should be significantly shorter than they were in Go 1.6 for programs with large numbers of idle goroutines, substantial stack size fluctuation, or large package-level variables.

Core library

Context

Go 1.7 moves the golang.org/x/net/context package into the standard library as context. This allows the use of contexts for cancelation, timeouts, and passing request-scoped data in other standard library packages, including net, net/http, and os/exec, as noted below.

有关上下文的更多信息,请参阅软件包文档和Go博客文章" Go Concurrent Patterns:Context" .

HTTP Tracing

Go 1.7引入了net/http/httptrace ,这是一个提供跟踪HTTP请求中事件的机制的软件包.

Testing

testing包现在支持带有子测试的测试定义和带有子基准的基准测试. 这种支持使编写表驱动的基准测试和创建分层测试变得容易. 它还提供了一种共享通用设置和拆卸代码的方法. 有关详细信息,请参见包装文档 .

Runtime

现在,由运行时启动的所有恐慌都使用实现语言规范要求的 ,同时实现内置errorruntime.Error恐慌值.

在紧急情况下,如果知道信号的名称,它将被打印在堆栈跟踪中. 否则,将使用信号编号,就像Go1.7之前的一样.

新功能KeepAlive提供了一种显式机制,用于声明必须认为已分配的对象必须在程序中的特定点可访问,通常是为了延迟关联终结器的执行.

新功能CallersFrames将从Callers获得的PC Slice转换为与调用堆栈相对应的帧序列. 应该首选这种新的API,而不是直接使用FuncForPC ,因为帧序列可以更准确地描述带有内联函数调用的调用堆栈.

新功能SetCgoTraceback有助于在使用cgo调用的同一过程中执行的Go和C代码之间更紧密的集成.

在32位系统上,运行时现在可以在地址空间中的任何位置使用操作系统分配的内存,从而消除了某些环境中常见的"操作系统分配的内存不在可用范围内"的故障.

现在,运行时可以将未使用的内存返回给所有体系结构上的操作系统. 在Go 1.6和更低版本中,运行时无法在ARM64、64位PowerPC或MIPS上释放内存.

在Windows上,Go 1.5及更早版本中的Go程序通过调用timeBeginPeriod(1)在启动时将全局Windows计时器分辨率强制为1ms. 更改全局计时器分辨率会在某些系统上引起问题,并且测试表明该调用不需要良好的调度程序性能,因此Go 1.6删除了该调用. Go 1.7带回了呼叫:在某些工作负载下,仍需要呼叫才能获得良好的调度程序性能.

Minor changes to the library

与往常一样,对库的各种微小更改和更新都遵循了Go 1 的兼容性承诺 .

bufio

在Go的早期版本中,如果要求ReaderPeek方法提供的字节数超出了基础缓冲区的ErrBufferFull ,则它将返回一个空切片和错误ErrBufferFull . 现在,它返回整个基础缓冲区,仍然伴有错误ErrBufferFull .

bytes

添加了新功能ContainsAnyContainsRune ,以与strings包对称.

在Go的早期版本中,如果要求ReaderRead方法提供零字节且没有剩余数据,则它将返回0计数且没有错误. 现在,它返回一个计数0和错误io.EOF .

Reader类型具有新的Reset方法,以允许重复使用Reader .

compress/flate

整个软件包中有许多性能优化. 解压缩速度提高了约10%,而DefaultCompression压缩速度快了两倍.

除了这些常规改进之外, BestSpeed压缩器已被完全替换,并使用类似于Snappy的算法,虽然输出可以比以前的算法大5-10%,但速度提高了约2.5倍.

还有一个新的压缩级别HuffmanOnly ,它适用于Huffman,但不适用于Lempel-Ziv编码. 前述的Lempel-谢夫编码装置,其HuffmanOnly运行约3X比新快BestSpeed但在产生压缩的输出比由新产生的那些更大的20-40%是成本BestSpeed .

重要的是要注意, BestSpeedHuffmanOnly产生符合RFC 1951的压缩输出. 换句话说,任何有效的DEFLATE解压缩器将继续能够解压缩这些输出.

最后,对解压缩器io.Reader的实现进行了微小的更改. 在以前的版本中,解压缩器将报告io.EOF推迟到完全无法读取更多字节为止. 现在,在读取最后一组字节时,它更急切地报告io.EOF .

crypto/tls

TLS实现使用较小的记录大小在每个连接上发送前几个数据包,然后逐渐增加到TLS最大记录大小. 这种启发式方法减少了第一个数据包可以解密之前必须接收的数据量,从而改善了低带宽网络上的通信延迟. 将ConfigDynamicRecordSizingDisabled字段设置为true会强制执行Go 1.6及更早版本的行为,在此行为中,数据包从连接开始就尽可能大.

The TLS client now has optional, limited support for server-initiated renegotiation, enabled by setting the Config's Renegotiation field. This is needed for connecting to many Microsoft Azure servers.

软件包返回的错误现在始终以tls:前缀开头. 在过去的版本中,一些错误使用crypto/tls:前缀,一些错误使用tls:前缀,而某些根本没有前缀.

生成自签名证书时,该程序包默认不再设置" Authority Key Identifier"字段.

crypto/x509

新功能SystemCertPool提供对整个系统证书池的访问(如果有). 还有一个新的关联错误类型SystemRootsError .

debug/dwarf

Reader类型的新SeekPC方法和Data类型的新Ranges方法有助于找到要传递给LineReader的编译单元,并为给定程序计数器标识特定功能.

debug/elf

The new R_390 relocation type and its many predefined constants support the S390 port.

encoding/asn1

现在,ASN.1解码器拒绝非最小整数编码. 这可能导致程序包拒绝某些无效但先前已接受的ASN.1数据.

encoding/json

就像顶级Indent函数一样, Encoder的新SetIndent方法设置JSON编码的缩进参数.

Encoder的新SetEscapeHTML方法控制是否将&< ,和>在引用的字符串的字符应当被转义为\u0026\u003c ,和\u003e ,分别. 与以前的版本一样,编码器默认使用此转义,以避免在将JSON嵌入HTML时可能出现的某些问题.

在Go的早期版本中,此程序包仅支持使用具有字符串类型的键的编码和解码映射. Go 1.7使用整数类型的键添加了对地图的支持:编码使用带引号的十进制表示形式作为JSON键. Go 1.7还添加了对使用实现MarshalText非字符串键编码地图的支持(请参见encoding.TextMarshaler ),以及对使用实现了UnmarshalText非字符串键解码地图的支持(请参见encoding.TextUnmarshaler ). 对于字符串类型的键,将忽略这些方法,以保留Go早期版本中使用的编码和解码.

当编码一片类型化的字节时, Marshal现在会生成一个使用该字节类型的MarshalJSONMarshalText方法(如果存在)编码的元素数组,如果两种方法都不可用,则仅使用默认的base64编码字符串数据. Go的早期版本既接受原始的base64编码的字符串编码,也接受数组编码(假设字节类型也适当地实现了UnmarshalJSONUnmarshalText ),因此,即使更改确实有所变化,此更改也应在语义上与Go的早期版本兼容所选的编码.

go/build

为了实现go命令对仅二进制软件包和基于cgo软件包中的Fortran代码的新支持, Package类型添加了新字段BinaryOnlyCgoFFLAGSFFiles .

go/doc

为了支持上述的go test中的相应更改, Example结构添加了一个Unordered字段,该字段指示示例是否可以按任何顺序生成其输出行.

io

该软件包添加了新的常量SeekStartSeekCurrentSeekEnd ,以与Seeker实现一起使用. 与os.SEEK_SETos.SEEK_CURos.SEEK_END ,这些常量是更os.SEEK_END ,但为了兼容性,将保留后者.

math/big

所述Float型增加GobEncodeGobDecode方法,使类型的值Float现在可以编码并使用解码的encoding/gob包.

math/rand

现在, Read函数和RandRead方法会生成一个伪随机字节流,该字节流是一致的,并且不依赖于输入缓冲区的大小.

该文档阐明,尽管全局函数SeedRead是(并且一直都是)安全的,但同时调用Rand的SeedRead方法并不安全.

mime/multipart

Writer实现现在发出按键排序的每个多部分节的标题. 以前,在地图上进行迭代会导致节头使用不确定的顺序.

net

作为上下文介绍的一部分, Dialer类型具有一个新方法DialContext ,例如Dial但是为Dial操作添加了context.Context . 该上下文旨在淘汰DialerCancelDeadline字段,但是实现向后兼容,因此继续尊重它们.

IP类型的String方法更改了无效IP地址的结果. 在过去的版本中,如果IP字节片的长度不是0、4或16,则String返回"?" . Go 1.7加上字节的十六进制编码,如"?12ab" .

现在,纯Go 名称解析实现尊重nsswitch.conf声明的相对于本地文件(即/etc/hosts )查找的DNS查找优先级的优先级.

net/http

ResponseWriter的文档现在清楚地表明,开始编写响应可能会阻止将来对请求正文的读取. 为了获得最大的兼容性,鼓励实现在写入响应的任何部分之前完全读取请求正文.

As part of the introduction of context, the Request has a new methods Context, to retrieve the associated context, and WithContext, to construct a copy of Request with a modified context.

Server实现中, Serve使用键ServerContextKey在请求上下文中记录基础*Server以及使用键LocalAddrContextKey在其上接收到请求的本地地址( Addr ). 例如,接收请求的地址是req.Context().Value(http.LocalAddrContextKey).(net.Addr) .

现在,仅当Server.TLSConfig字段为nil或在其TLSConfig.NextProtos包含"h2" ,服务器的Serve方法才启用HTTP / 2支持.

现在,服务器实现将协议要求的响应代码w.WriteHeader(5)为少于100到三位数,因此w.WriteHeader(5)使用HTTP响应状态005 ,而不仅仅是5 .

现在,根据RFC 7230显式设置"块"时,服务器实现仅正确发送一个" Transfer-Encoding"头.

现在,服务器实现对于拒绝具有无效HTTP版本的请求更加严格. 现在拒绝了声称为HTTP / 0.x的无效请求(从未完全支持HTTP / 0.9),现在也拒绝了除" PRI * HTTP / 2.0"升级请求以外的纯文本HTTP / 2请求. 服务器继续处理加密的HTTP / 2请求.

在服务器中,超时处理程序将在空响应主体上发回200状态代码,而不是发回0作为状态代码.

在客户端中, Transport实现将请求上下文传递给连接到远程服务器的任何拨号操作. 如果需要自定义拨号程序,则新的Transport字段DialContext优先于现有的Dial字段,以允许传输提供上下文.

Transport还添加了IdleConnTimeoutMaxIdleConnsMaxResponseHeaderBytes字段,以帮助控制空闲或闲聊服务器消耗的客户端资源.

Client配置的CheckRedirect函数现在可以返回ErrUseLastResponse以指示应作为HTTP请求的结果返回最新的重定向响应. 该响应现在作为req.Response可供CheckRedirect函数req.Response .

从Go 1开始,HTTP客户端的默认行为是使用Accept-Encoding请求标头请求服务器端压缩,然后透明地解压缩响应主体,此行为可以使用TransportDisableCompression字段进行调整. 在Go 1.7中,为帮助实现HTTP代理, Response的新Uncompressed字段报告了是否进行了这种透明的解压缩.

DetectContentType添加了对一些新的音频和视频内容类型的支持.

net/http/cgi

Handler添加一个新的字段Stderr ,该字段允许将子进程的标准错误重定向到宿主进程的标准错误之外.

net/http/httptest

新功能NewRequest准备了一个新的http.Request适合在测试期间传递给http.Handler .

ResponseRecorder的新Result方法返回记录的http.Response . 需要检查响应的标题或结尾的测试应调用Result并检查响应字段,而不是直接访问ResponseRecorderHeaderMap .

net/http/httputil

现在,当ReverseProxy实现无法到达后端时,它会以" 502 Bad Gateway"响应. 在早期版本中,它的响应为" 500 Internal Server Error".

ClientConnServerConn均已记录为已弃用. 它们是低级的,旧的,并且Go的当前HTTP堆栈未使用它们,并且将不再更新. 程序应该使用http.Clienthttp.Transporthttp.Server代替.

net/http/pprof

安装用于处理路径/debug/pprof/trace的运行时跟踪HTTP处理程序,现在在其seconds查询参数中接受小数,从而允许以小于一秒的间隔收集跟踪. 这在繁忙的服务器上特别有用.

net/mail

现在,地址解析器允许在RFC 6532之后的地址中使用未转义的UTF-8文本,但不会对结果应用任何规范化. 为了与较旧的邮件解析器兼容,地址编码器(即AddressString方法)继续转义所有遵循RFC 5322的 UTF-8文本.

ParseAddress函数和AddressParser.Parse方法更加严格. 他们过去常常忽略电子邮件地址后的所有字符,但现在除空白以外的其他任何内容都会返回错误.

net/url

URL的新ForceQuery字段记录URL是否必须具有查询字符串,以便将没有查询字符串的URL(例如/search )与具有空查询字符串的URL(例如/search? )区分开.

os

IsExist现在在存在该错误的系统上为syscall.ENOTEMPTY返回true.

在Windows上," Remove现在会在可能的情况下删除只读文件,从而使实现与在非Windows系统上一样.

os/exec

作为上下文介绍的一部分,新的构造函数CommandContext类似于Command但包含可用于取消命令执行的上下文.

os/user

现在即使cgo不可用,也可以实现Current函数.

新的Group类型,以及查找函数LookupGroupLookupGroupId以及User结构中的新字段GroupIds ,提供了对系统特定的用户组信息的访问.

reflect

尽管如果给定的字段编号i超出范围, ValueField方法始终被记录为紧急情况,但它却默默地返回了零Value . Go 1.7将方法更改为已记录的行为.

新的StructOf函数在运行时构造一个struct类型. 它完成了类型构造函数集,将ArrayOfChanOfFuncOfMapOfPtrToSliceOf .

StructTag的新方法Lookup类似于Get但是将不包含给定键的标签与将空字符串与给定键相关联的标签区分开.

TypeValueMethodNumMethod方法不再返回或计数未导出的方法.

strings

在Go的早期版本中,如果要求ReaderRead方法提供零字节且没有剩余数据,则它将返回0计数且没有错误. 现在,它返回一个计数0和错误io.EOF .

Reader类型具有新的Reset方法,以允许重复使用Reader .

time

Duration的time.Duration.String方法现在将零持续时间报告为"0s" ,而不是"0" . ParseDuration继续接受两种形式.

现在,方法调用time.Local.String()在所有系统上都返回"Local" ; 在早期版本中,它在Windows上返回了空字符串.

$GOROOT/lib/time的时区数据库已更新至IANA版本2016d. 仅当找不到系统时区数据库时(例如在Windows上),才使用此后备数据库. Windows时区缩写列表也已更新.

syscall

在Linux上, SysProcAttr结构(在os/exec.CmdSysProcAttr字段中使用)具有一个新的Unshareflags字段. (2) system call before executing the new program. 如果该字段非零,则由ForkExec创建的子进程(在exec.CmdRun方法中使用)将在执行新程序之前调用 (2)系统调用.

unicode

整个系统的unicode包和相关支持已从8.0版本升级到Unicode 9.0 .

by  ICOPY.SITE