Black Lives Matter. Support the Equal Justice Initiative.

Go 1.9 Release Notes

Introduction to Go 1.9

最新的Go版本1.9版在Go 1.8之后六个月到来,并且是Go 1.x系列中的第十个版本. 语言有两种更改 :添加对类型别名的支持,以及定义实现何时可能融合浮点运算. 大多数更改是在工具链,运行时和库的实现中进行的. 与往常一样,该发行版保留了Go 1 兼容性的承诺 . 我们希望几乎所有Go程序都能像以前一样继续编译和运行.

该版本增加了透明的单调时间支持并行化了包内函数的编译 ,更好地支持了测试助手功能 ,包括了新的位操作包 ,并具有了新的并发映射类型 .

Changes to the language

语言有两种更改.

Go现在支持类型别名,以在包之间移动类型时支持渐进式代码修复. 类型别名设计文档有关重构的文章详细介绍了该问题. 简而言之,类型别名声明具有以下形式:

type T1 = T2

该声明为T2表示的类型引入了别名T1另一种拼写形式); 也就是说, T1T2表示相同的类型.

较小的语言更改是, 语言规范现在说明何时允许实现将浮点运算融合在一起,例如通过使用体系结构的"融合乘法和加法"(FMA)指令来计算x*y + z而不舍入中间结果x*y 要强制进行中间舍入,请编写float64(x*y) + z .

Ports

此版本中没有新的受支持的操作系统或处理器体系结构.

ppc64x requires POWER8

现在, GOARCH=ppc64GOARCH=ppc64le都至少需要POWER8支持. 在以前的版本中,仅GOARCH=ppc64le需要POWER8,大端序的ppc64架构支持较早的硬件.

FreeBSD

Go 1.9是将在FreeBSD 9.3上运行的最后一个版本,FreeBSD已经不支持它 . Go 1.10需要FreeBSD 10.3+.

OpenBSD 6.0

Go 1.9现在启用了cgo二进制文件的PT_TLS生成,因此需要OpenBSD 6.0或更高版本. Go 1.9不再支持OpenBSD 5.9.

Known Issues

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

Go stopped running NetBSD builders during the Go 1.9 development cycle due to NetBSD kernel crashes, up to and including NetBSD 7.1. As Go 1.9 is being released, NetBSD 7.1.1 is being released with a fix. However, at this time we have no NetBSD builders passing our test suite. Any help investigating the various NetBSD issues would be appreciated.

Tools

Parallel Compilation

Go编译器现在支持利用多个内核并行编译包的功能. 这是go命令现有的对并行编译单独软件包的支持的补充. 并行编译默认情况下处于打开状态,但是可以通过将环境变量GO19CONCURRENTCOMPILATION设置为0来禁用它.

Vendor matching with ./...

根据普遍要求, ./...不再匹配接受包名称的工具(例如go testvendor目录中的包. 要匹配供应商目录,请写入./vendor/...

Moved GOROOT

现在, go工具将使用调用它的路径来尝试查找Go安装树的根. 这意味着,如果整个Go安装都移到了新位置,则go工具应继续照常工作. 可以通过在环境中设置GOROOT来覆盖此设置,只有在特殊情况下才可以这样做. 请注意,这不会影响runtime.GOROOT函数的结果,该函数将继续报告原始安装位置. 这可能会在以后的版本中修复.

Compiler Toolchain

复杂部门现在与C99兼容. 在gccgo中一直是这种情况,现在已在gc工具链中修复.

链接器现在将为Windows上的cgo可执行文件生成DWARF信息.

如果提供了-N -l标志,则编译器现在在生成的DWARF中包括词法作用域,从而允许调试器隐藏不在作用域内的变量. .debug_info节现在是DWARF版本4.

go工具的依赖项缓存现在使用GOARMGO386的值来影响已编译程序包的内部版本ID.

Assembler

现在,正确地组装了四操作数ARM MULA指令,其中加数寄存器作为第三个参数,结果寄存器作为第四个参数和最后一个参数. 在以前的版本中,这两个含义相反. 三操作数形式(第四个参数与第三个参数隐式相同)不受影响. 使用四操作数MULA指令的代码将需要更新,但是我们认为这种形式很少使用. MULAWTMULAWB已经以所有形式使用了正确的顺序,并且没有变化.

汇编器现在支持ADDSUBPS/PD ,从而完成了两条缺少的x86 SSE3指令.

Doc

一长串参数现在被截断. 这样可以提高go doc在某些生成代码上的可读性.

现在支持查看有关结构字段的文档. 例如, go doc http.Client.Jar .

Env

新的go env -json标志启用JSON输出,而不是默认的特定于OS的输出格式.

Test

go test命令接受一个新的-list标志,该标志使用一个正则表达式作为参数,并打印以输出任何与之匹配的测试,基准或示例的名称,而无需运行它们.

Pprof

由生成的配置文件runtime/pprof包现在包括符号信息,这样他们就可以在观看go tool pprof没有产生该配置文件中的二进制文件.

go tool pprof命令现在使用环境中定义的HTTP代理信息,即http.ProxyFromEnvironment .

Vet

vet的命令已被更好地融入go的工具 ,所以go vet现在支持所有标准打造的标志,而vet自己的国旗现在可以从go vet ,以及来自go tool vet .

Gccgo

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

Runtime

Call stacks with inlined frames

runtime.Callers用户应避免直接检查生成的PC切片,而应使用runtime.CallersFrames来获取调用堆栈的完整视图,或者使用runtime.Caller来获取有关单个调用者的信息. 这是因为PC Slice的单个元素无法解释调用堆栈的内联帧或其他细微差别.

具体来说,直接在PC片上进行迭代并使用诸如runtime.FuncForPC功能来单独解析每台PC的代码将丢失内联帧. 为了获得堆栈的完整视图,此类代码应改用CallersFrames . 同样,代码不应假定调用Callers返回的长度是呼叫深度的任何指示. 相反,它应该计算CallersFrames返回的CallersFrames .

在特定深度查询单个调用者的代码应使用Caller而不是将长度为1的切片传递给Callers .

runtime.CallersFrames从Go 1.7开始可用,因此可以在升级到Go 1.9之前更新代码.

Performance

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

Garbage Collector

Library functions that used to trigger stop-the-world garbage collection now trigger concurrent garbage collection. Specifically, runtime.GC, debug.SetGCPercent, and debug.FreeOSMemory, now trigger concurrent garbage collection, blocking only the calling goroutine until the garbage collection is done.

debug.SetGCPercent函数仅在由于新的GOGC值而立即需要垃圾回收时才触发垃圾回收. 这样就可以即时调整GOGC.

在使用包含许多大型对象的大型(> 50GB)堆的应用程序中,大型对象分配性能得到了显着改善.

现在,即使对于非常大的堆, runtime.ReadMemStats函数也只需不到100µs的时间.

Core library

Transparent Monotonic Time support

现在, time包可以透明地跟踪每个" Time值中的单调时间,从而可以在有挂钟调整的情况下安全地操作两个" Time值之间的持续Time . 有关详细信息,请参见软件包文档设计文档 .

New bit manipulation package

Go 1.9包括一个新的软件包math/bits ,具有用于操纵位的优化实现. 在大多数体系结构上,编译器还会识别此包中的功能,并将其视为内在函数,以提高性能.

Test Helper Functions

新的(*T).Helper(*B).Helper方法将调用函数标记为测试辅助函数. 打印文件和行信息时,该功能将被跳过. 这允许编写测试助手功能,同时仍然为用户提供有用的行号.

Concurrent Map

sync包中的新Map类型是并发映射,其中包含固定时间摊销的加载,存储和删除. 多个goroutine可以同时调用Map的方法是安全的.

Profiler Labels

现在, runtime/pprof软件包支持将标签添加到pprof分析器记录. 标签形成键-值映射,当使用pprof命令查看配置文件时,该键-值映射用于区分不同上下文中相同函数的调用. pprof软件包的新Do函数运行与某些提供的标签关联的代码. 软件包中的其他新功能可帮助使用标签.

Minor changes to the library

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

archive/zip

现在,ZIP Writer在适当的时候在FileHeader.Flags设置UTF-8位.

crypto/rand

在Linux上,Go现在可以调用不带GRND_NONBLOCK标志的getrandom系统调用. 现在它将阻塞直到内核具有足够的随机性. 在早于getrandom系统调用的内核上,Go继续从/dev/urandom读取.

crypto/x509

在Unix系统上,现在可以使用环境变量SSL_CERT_FILESSL_CERT_DIR分别覆盖SSL证书文件和SSL证书文件目录的系统默认位置.

FreeBSD文件/usr/local/etc/ssl/cert.pem现在包含在证书搜索路径中.

该软件包现在支持名称约束中排除的域. 除了强制执行此类约束之外,如果提供的模板证书具有新字段ExcludedDNSDomains ,则CreateCertificate将创建具有排除名称约束的证书.

如果证书中存在任何SAN扩展(包括没有DNS名称),则将忽略" Subject的"公用名". 在以前的版本中,代码仅测试证书中是否存在DNS名称SAN.

database/sql

如果在Tx.Stmt可用,则该软件包现在将使用缓存的Stmt . 这样可以防止在每次调用Tx.Stmt重新准备语句.

该软件包现在允许驱动程序通过实现driver.NamedValueChecker来实现自己的参数检查器. 这也使驱动程序可以支持OUTPUTINOUT参数类型. 当驱动程序支持时,应使用Out返回输出参数.

Rows.Scan现在可以扫描用户定义的字符串类型. 以前,该软件包支持扫描到数字类型,例如Int int64 type . 现在,它还支持扫描到字符串类型(如String string type .

新的DB.Conn方法返回新的Conn类型,该类型表示从连接池到数据库的独占连接. 在Conn上运行的所有查询都将使用相同的基础连接,直到Conn.Close将该连接返回到连接池为止.

encoding/asn1

新的NullBytesNullRawValue表示ASN.1 NULL类型.

encoding/base32

新的Encoding.WithPadding方法增加了对自定义填充字符和禁用填充的支持.

encoding/csv

新字段Reader.ReuseRecord控制对Read调用是否可以返回与上次调用的返回切片共享后备数组的切片,以提高性能.

fmt

The sharp flag ('#') is now supported when printing floating point and complex numbers. It will always print a decimal point for %e, %E, %f, %F, %g and %G; it will not remove trailing zeros for %g and %G.

hash/fnv

The package now includes 128-bit FNV-1 and FNV-1a hash support with New128 and New128a, respectively.

html/template

现在,如果在管道中找到了预定义的转义符(" html"," urlquery"和" js"之一),并且与自动转义符自己决定的转义符不匹配,则程序包将报告错误. 这样可以避免某些安全性或正确性问题. 现在,使用其中一个转义符总是无操作或错误. (无操作情况可简化从text / template的迁移.)

image

现在,如记录所示,在相邻但不重叠的矩形上调用Rectangle.Intersect方法时,返回的Rectangle为零. 在早期版本中,它将错误地返回一个空但非零的Rectangle .

image/color

对YCbCr到RGBA的转换公式进行了调整,以确保舍入调整跨越整个[0,0xffff] RGBA范围.

image/png

新的Encoder.BufferPool字段允许指定EncoderBufferPool ,编码器将在编码PNG图像时使用它来获取临时的EncoderBuffer缓冲区. BufferPool的使用减少了对多个图像进行编码时执行的内存分配数量.

该软件包现在支持对透明8位灰度(" Gray8")图像进行解码.

math/big

新的IsInt64IsUint64方法报告是否可以将Int表示为int64uint64值.

mime/multipart

新的FileHeader.Size字段描述了多部分消息中文件的大小.

net

新的Resolver.StrictErrors提供了对Go的内置DNS解析器如何处理由多个子查询组成的查询(例如A + AAAA地址查找)期间的临时错误的控制.

新的Resolver.Dial允许Resolver使用自定义拨号功能.

JoinHostPort现在仅在主机包含冒号的情况下才将地址放在方括号中. 在以前的版本中,如果地址中包含百分号(' % '),它也将地址括在方括号中.

新方法TCPConn.SyscallConnIPConn.SyscallConnUDPConn.SyscallConnUnixConn.SyscallConn提供对连接的基础文件描述符的访问.

在使用Listen ("tcp", ":0")创建侦听器之后,现在可以安全地使用从(*TCPListener).String()获得的地址调用Dial . 以前,在某些配置了一半IPv6堆栈的计算机上,它失败了.

net/http

现在,用于CookieSet-Cookie标头的Cookie.String方法Set-Cookie值(如果值包含空格或逗号)用双引号引起来.

服务器更改:

客户和运输变更:

net/http/fcgi

新的ProcessEnv函数返回与HTTP请求相关联的FastCGI环境变量,该请求没有适当的http.Request字段,例如REMOTE_USER .

net/http/httptest

新的Server.Client方法返回配置用于向测试服务器发出请求的HTTP客户端.

新的Server.Certificate方法返回测试服务器的TLS证书(如果有).

net/http/httputil

The ReverseProxy now proxies all HTTP/2 response trailers, even those not declared in the initial response header. Such undeclared trailers are used by the gRPC protocol.

os

os软件包现在将内部运行时轮询器用于文件I / O. 这减少了对管道进行读/写操作所需的线程数,并且消除了一个goroutine关闭文件而另一个goroutine将文件用于I / O时的争用.

在Windows上,现在不使用shell32.dll填充Args ,从而将进程启动时间缩短了1-7毫秒.

os/exec

os/exec软件包现在可以防止使用任何重复的环境变量创建子进程. 如果Cmd.Env包含重复的环境键,则仅使用切片中每个重复键的最后一个值.

os/user

通过读取/etc/passwd文件,当CGO_ENABLED=0时, LookupLookupId现在可以在Unix系统上使用.

CGO_ENABLED=0通过读取/etc/group文件, LookupGroupLookupGroupId现在可以在Unix系统上使用.

reflect

新的MakeMapWithSize函数创建带有容量提示的地图.

runtime

现在,在存在内联的情况下,运行时生成的并记录在概要文件中的回溯是准确的. 要以编程方式检索回溯,应用程序应该使用runtime.CallersFrames而不是直接遍历runtime.Callers的结果.

在Windows上,当程序空闲时,Go不再强制系统计时器以高分辨率运行. 这样可以减少Go程序对电池寿命的影响.

在FreeBSD上, GOMAXPROCSruntime.NumCPU现在基于进程的CPU掩码,而不是CPU的总数.

运行时已初步支持AndroidO.

runtime/debug

以负值调用SetGCPercent不再运行即时垃圾回收.

runtime/trace

现在,执行跟踪将显示标记辅助事件,这些事件指示何时由于应用程序goroutine分配太快而被迫辅助垃圾回收.

现在,"扫描"事件涵盖了寻找分配可用空间的整个过程,而不是记录每个被扫描的跨度. 跟踪分配繁重的程序时,这减少了分配等待时间. 清除事件显示清除了多少字节以及回收了多少字节.

sync

Mutex现在更公平了.

syscall

新字段Credential.NoSetGroups控制着Unix系统在启动新进程时是否进行setgroups系统调用来设置补充组.

新字段SysProcAttr.AmbientCaps允许在创建新进程时在Linux SysProcAttr.AmbientCaps设置环境功能.

在64位x86 Linux上,通过使用CLONE_VFORKCLONE_VM可以优化进程创建延迟.

新的Conn接口描述了net包中的某些类型,这些类型可以使用新的RawConn接口提供对其基本文件描述符的访问.

testing/quick

现在,程序包在生成int64uint64随机数时会选择完整范围内的值; 在早期版本中,生成的值始终限于[-2 62,2 62 )范围.

在以前的版本中,使用nil Config.Rand值会导致使用固定的确定性随机数生成器. 现在,它使用随机数生成器作为当前时间的种子. 对于旧的行为,将Config.Rand设置为rand.New(rand.NewSource(0)) .

text/template

对空块的处理已得到修复,该处理被Go 1.8更改打破,该更改使结果取决于模板的顺序,从而恢复了旧的Go 1.7行为.

time

新方法Duration.RoundDuration.Truncate舍入和截断持续时间为给定持续时间的倍数.

现在,在Wine下可以正常获取时间和睡眠.

如果Time值具有单调时钟读数,则其字符串表示形式(由String返回)现在包括最终字段"m=±value" ,其中value是单调时钟读数,格式为秒的十进制数.

随附的tzdata时区数据库已更新至版本2017b. 与往常一样,仅当系统尚无数据库可用时才使用它.

by  ICOPY.SITE