Go 1.11 Release Notes

Introduction to Go 1.11

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

Changes to the language

语言规范没有变化.

Ports

正如Go 1.10发行说明中宣布的那样 ,Go 1.11现在需要OpenBSD 6.2或更高版本,macOS 10.10 Yosemite或更高版本,或Windows 7或更高版本; 这些操作系统的早期版本的支持已删除.

Go 1.11支持即将发布的OpenBSD 6.4版本. 由于OpenBSD内核中的更改,Go的较早版本无法在OpenBSD 6.4上使用.

i386硬件上的NetBSD存在已知问题 .

现在, linux/ppc64le和小部分netbsd/amd64支持种族检测器. NetBSD竞赛检测器支持存在已知问题 .

linux/arm64现在支持内存清理器( -msan ).

freebsd/amd64现在支持构建模式c-sharedc-archive .

在64位MIPS系统上,新的环境变量设置GOMIPS64=hardfloat (缺省值)和GOMIPS64=softfloat选择是使用硬件指令还是软件仿真来进行浮点计算. 对于32位系统,环境变量仍然是GOMIPS ,如Go 1.10中添加 .

在软浮点ARM系统( GOARM=5 )上,Go现在使用更高效的软件浮点接口. 这对于Go代码是透明的,但是使用不受GOARM保护的浮点指令的ARM程序集会中断,并且必须移植到新接口 .

在ARMv7上使用1.11版不再需要使用KUSER_HELPERS配置的Linux内核. 此设置在默认内核配置中启用,但有时在精简配置中被禁用.

WebAssembly

Go 1.11向WebAssemblyjs/wasm )添加了一个实验端口.

Go程序当前可编译为一个WebAssembly模块,该模块包括Go运行时,用于goroutine调度,垃圾回收,地图等.因此,结果大小至少约为2 MB,或压缩后500 KB. Go程序可以使用新的实验性syscall/jssyscall/js JavaScript. 二进制大小和与其他语言的互操作尚未成为优先事项,但将来的发行版中可能会解决.

由于添加了新的GOOS值" js "和GOARCH值" wasm ",因此Go工具现在将忽略名为*_js.go*_wasm.go Go文件,除非使用了这些GOOS / GOARCH值. 如果您已有与这些模式匹配的文件名,则需要重命名它们.

可以在WebAssembly Wiki页面上找到更多信息.

RISC-V GOARCH values reserved

主要的Go编译器尚不支持RISC-V架构 但我们保留了确实支持RISC-V的Gccgo使用的GOARCH值" riscv "和" riscv64 ". 这意味着Go工具现在也将忽略名为*_riscv.go Go文件,除非使用了那些GOOS / GOARCH值.

Tools

Modules, package versioning, and dependency management

Go 1.11添加了对称为"模块"新概念的初步支持,这是GOPATH的替代方案,具有对版本控制和程序包分发的集成支持. 使用模块,开发人员不再局限于在GOPATH中工作,版本相关性信息是明确而轻巧的,并且构建更加可靠和可复制.

模块支持被认为是实验性的. 根据Go 1.11用户的反馈,详细信息可能会更改,并且我们计划了更多工具. 尽管模块支持的详细信息可能会更改,但是使用Go 1.11转换为模块的项目将继续在Go 1.12和更高版本中使用. 如果您在使用模块时遇到错误,请提出问题,以便我们进行修复. 有关更多信息,请参阅go命令文档 .

Import path restriction

由于Go模块支持在命令行操作中为@符号分配了特殊含义,因此go命令现在禁止使用包含@符号的导入路径. 这样的导入路径永远不会被go get允许,因此此限制只会影响通过其他方式构建自定义GOPATH树的用户.

Package loading

新的软件包golang.org/x/tools/go/packages提供了一个简单的API,用于查找和加载Go源代码的软件包. 尽管尚未成为标准库的一部分,但对于许多任务,它有效地替代了go/build包,后者的API无法完全支持模块. 因为它运行诸如go list类的外部查询命令来获取有关Go软件包的信息,所以它使分析工具的构建可以与替代构建系统(如BazelBuck)同样良好地工作.

Build cache requirement

Go 1.11将是支持将环境变量GOCACHE=off为禁用构建缓存的最新版本 ,Go 1.10中引入了该功能. 从Go 1.12开始,将需要构建缓存,以消除$GOPATH/pkg . 上面描述的模块和程序包加载支持已经要求启用构建缓存. 如果您为了避免遇到问题而禁用了构建缓存,请提出问题以告知我们.

Compiler toolchain

现在,默认情况下,更多函数可以进行内联,包括调用panic函数.

编译器工具链现在支持行指令中的列信息.

引入了新的程序包导出数据格式. 这对于最终用户应该是透明的,除了可以加快大型Go项目的构建时间. 如果确实引起问题,可以在构建二进制文件时通过将-gcflags=all=-iexport=false传递给go工具再次将其关闭.

现在,编译器将拒绝在类型切换防护中声明的未使用的变量,例如以下示例中的x

func f(v interface{}) {
	switch x := v.(type) {
	}
}

这已经被gccgogo / types拒绝了.

Assembler

amd64的汇编器现在接受AVX512指令.

Debugging

现在,编译器会为优化的二进制文件生成更准确的调试信息,包括可变位置信息,行号和断点位置. 这样应该可以调试没有 -N -l编译的二进制文件. 调试信息的质量仍然有局限性,其中一些是基本的,其中一些将随着将来的发行版而不断改善.

由于编译器生成的扩展信息和更准确的调试信息,现在默认情况下压缩DWARF节. 这对于大多数ELF工具(例如Linux和* BSD上的调试器)是透明的,并且在所有平台上都由Delve调试器支持,但是在macOS和Windows上对本机工具的支持有限. 要禁用DWARF压缩, go在构建二进制文件时将-ldflags=-compressdwarf=false传递给go工具.

Go 1.11添加了对从调试器中调用Go函数的实验性支持. 例如,这在断点处暂停时调用String方法很有用. 当前仅由Delve(版本1.1.0及更高版本)支持.

Test

从Go 1.10开始, go test命令在go test的软件包上运行go vet ,以在运行测试之前确定问题. 由于vet在运行前会使用go / types对代码进行类型检查,因此不进行类型检查的测试现在将失败. 特别是,在用Go 1.10编译的闭包中包含未使用变量的测试,因为Go编译器错误地接受了它们( 问题#3059 ),但是现在将失败,因为在这种情况下go/types正确报告了"未使用变量"错误.

现在, go test-memprofile标志默认为" allocs"配置文件,该配置文件记录自测试开始以来分配的总字节数(包括垃圾收集的字节数).

Vet

现在,当所分析的软件包未进行类型检查时, go vet命令将报告致命错误. 以前,类型检查错误只是导致打印警告,而vet以状态1退出.

此外,当格式检查printf包装程序时, go vet变得更加强大. 兽医现在在以下示例中检测到错误:

func wrapper(s string, args ...interface{}) {
	fmt.Printf(s, args...)
}

func main() {
	wrapper("%s", 42)
}

Trace

使用新的runtime/trace包的用户注释API ,用户可以在执行跟踪中记录应用程序级信息,并创建相关的goroutine组. go tool trace命令可以在跟踪视图和新的用户任务/区域分析页面中可视化此信息.

Cgo

Since Go 1.10, cgo has translated some C pointer types to the Go type uintptr. These types include the CFTypeRef hierarchy in Darwin's CoreFoundation framework and the jobject hierarchy in Java's JNI interface. In Go 1.11, several improvements have been made to the code that detects these types. Code that uses these types may need some updating. See the Go 1.10 release notes for details.

Go command

现在可以使用环境变量GOFLAGS设置go命令的默认标志. 在某些情况下这很有用. 由于DWARF,在功率不足的系统上链接可能会明显变慢,并且用户可能希望默认设置-ldflags=-w . 对于模块,某些用户和CI系统将始终希望-mod=vendor ,因此默认情况下应设置-mod=vendor . 有关更多信息,请参阅go命令文档 .

Godoc

Go 1.11将是支持godoc命令行界面的最新版本. 在将来的版本中, godoc将仅是Web服务器. 用户应改用go doc作为命令行帮助输出.

现在, godoc网络服务器将显示Go的哪个版本引入了新的API功能. 类型,函数和方法的初始Go版本显示为右对齐. 例如,请参阅UserCacheDir ,其右侧为" 1.11". 对于struct字段,当在Go版本中添加struct字段时(而不是引入类型本身时)会添加内联注释. 有关struct字段的示例,请参见ClientTrace.Got1xxResponse .

Gofmt

Go源代码的默认格式的一个小细节已更改. 使用内联注释格式化表达式列表时,注释将根据启发式进行对齐. 但是,在某些情况下,对齐方式会很容易拆分,或者会引入过多的空白. 启发式已更改为对人工编写的代码而言表现更好.

请注意,有时会对gofmt进行此类次要更新. 通常,需要一致格式的Go源代码的系统应使用gofmt二进制文件的特定版本. 有关更多信息,请参见go / format软件包文档.

Run

现在, go run命令允许单个导入路径,目录名称或与单个软件包匹配的模式. 这允许go run pkggo run dir ,最重要的是go run .

Runtime

现在,运行时使用的是稀疏堆布局,因此Go堆的大小不再受限制(以前,限制为512GiB). 这还修复了混合Go / C二进制文件或使用-race编译的二进制文件中罕见的"地址空间冲突"故障.

在macOS和iOS上,运行时现在使用libSystem.dylib而不是直接调用内核. 这将使Go二进制文件与macOS和iOS的未来版本更加兼容. syscall程序包仍然直接进行系统调用. 解决此问题计划在将来的版本中进行.

Performance

As always, the changes are so general and varied that precise statements about performance are difficult to make. Most programs should run a bit faster, due to better generated code and optimizations in the core library.

math/big程序包进行了多次性能更改,并且在整个树中对GOARCH=arm64进行了许多更改.

Compiler toolchain

现在,编译器优化了表单的地图清除操作:

for k := range m {
	delete(m, k)
}

编译器现在优化了append(s, make([]T, n)...)形式的切片扩展.

现在,编译器将执行更积极的边界检查和分支消除. 值得注意的是,它现在可以识别传递关系,因此,如果i<jj<len(s) ,则可以使用这些事实消除s[i]的边界检查. 它还了解诸如s[i-10]类的简单算法,并且可以识别循环中的更多归纳情况. 此外,编译器现在使用边界信息来更积极地优化移位操作.

Core library

对标准库的所有更改都是次要的.

Minor changes to the library

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

crypto

某些加密操作,包括ecdsa.Signrsa.EncryptPKCS1v15rsa.GenerateKey ,现在随机读取一个额外的随机字节,以确保测试不依赖内部行为.

crypto/cipher

新功能NewGCMWithTagSize用非标准标签长度实现Galois计数器模式,以与现有密码系统兼容.

crypto/rsa

PublicKey now implements a Size method that returns the modulus size in bytes.

crypto/tls

ConnectionState的新ExportKeyingMaterial方法允许根据RFC 5705导出绑定到连接的键材料.

crypto/x509

如果CN不是有效的主机名,则当不存在"使用者备用名称"时,将CommonName字段视为主机名的不推荐使用的旧行为现在已禁用. 所述CommonName可以通过添加实验值被完全忽略x509ignoreCN=1GODEBUG环境变量. 忽略CN时,不具有SAN的证书将在具有名称约束的链下进行验证,而不是返回NameConstraintsWithoutSANs .

仅当扩展密钥使用限制出现在VerifyOptionsKeyUsages字段中VerifyOptions ,才再次检查它们,而不是始终进行检查. 这与Go 1.9及更早版本的行为匹配.

现在已缓存SystemCertPool返回的值,并且可能无法反映调用之间的系统更改.

debug/elf

添加了更多的ELFOSABIEM常数.

encoding/asn1

MarshalUnmarshal现在支持领域"私人"类注释.

encoding/base32

解码器现在始终为不完整的块返回io.ErrUnexpectedEOF . 以前,在某些情况下,它将返回io.EOF .

encoding/csv

现在, Reader拒绝将Comma字段设置为双引号字符的尝试,因为双引号字符在CSV中已经具有特殊含义.

html/template

当将类型化的接口值传递给隐式转义符函数时,程序包已更改其行为. 以前,这样的值写为<nil> (转义形式). 现在,这些值将被忽略,就像无类型的nil值(并且一直被)忽略一样.

image/gif

现在支持非循环动画GIF. 它们的LoopCount为-1表示.

io/ioutil

TempFile函数现在支持指定文件名中随机字符的放置位置. 如果prefix参数包含" * ",则随机字符串将替换" * ". 例如, prefix参数" myname.*.bat "将导致随机文件名,例如" myname.123456.bat ". 如果不包含" * ",则将保留旧的行为,并将随机数字附加到末尾.

math/big

当g和n不是相对质数时, ModInverse现在返回nil. 结果以前是不确定的.

mime/multipart

具有丢失/空文件名的表单数据的处理已恢复为Go 1.9中的行为:在Form数据部分的表单中,值在" Value字段而不是" File字段中可用. 在Go版本1.10到1.10.3中,具有丢失/空文件名和非空" Content-Type"字段的表单数据部件存储在" File字段中. 此更改是1.10中的错误,现已恢复为1.9.

mime/quotedprintable

To support invalid input found in the wild, the package now permits non-ASCII bytes but does not validate their encoding.

net

新的ListenConfig类型和新的Dialer.Control字段分别允许在接受和创建连接之前设置套接字选项.

syscall.RawConn ReadWrite方法现在可以在Windows上正常工作.

现在,在TCPConn.ReadFrom调用的io.Copy TCP连接之间复制数据时, net软件包现在会在Linux上自动使用splice系统调用 . 结果是更快,更有效的TCP代理.

TCPConn.FileUDPConn.FileUnixConn.FileIPConn.File方法不再将返回的*os.File置于阻止模式.

net/http

Transport类型具有新的MaxConnsPerHost选项,该选项允许限制每个主机的最大连接数.

Cookie类型具有一个新的SameSite字段(新类型也称为SameSite ),以表示大多数浏览器最近支持的新cookie属性. net/httpTransport本身并不使用SameSite属性,但是该包支持解析和序列化该属性以供浏览器使用.

在调用ShutdownClose之后,不再允许重用Server . 过去从来没有官方支持过它,并且经常有令人惊讶的行为. 现在,将来所有对服务器Serve方法的调用都将在关闭或关闭后返回错误.

现在为HTTP状态代码421定义了StatusMisdirectedRequest常量.

收到流水线的HTTP / 1.1请求后,HTTP服务器将不再取消上下文或在CloseNotifier通道上发送. 浏览器不使用HTTP流水线,但是某些客户端(例如Debian的apt )可以配置为使用HTTP流水线.

DefaultTransport使用的ProxyFromEnvironment现在支持CIDR表示法和NO_PROXY环境变量中的端口.

net/http/httputil

ReverseProxy具有一个新的ErrorHandler选项,以允许更改错误的处理方式.

现在,按照gRPC协议的要求, ReverseProxy还可以将" TE: trailers "请求标头传递到后端.

os

新的UserCacheDir函数返回默认根目录,以用于特定于用户的缓存数据.

新的ModeIrregularFileMode位,用于表示文件不是常规文件,但对此文件一无所知,或者它不是套接字,设备,命名管道,符号链接或Go为其定义的其他文件类型模式位.

Symlink现在适用于启用了开发人员模式的计算机上Windows 10上的非特权用户.

当将非阻塞描述符传递给NewFile ,生成的*File将保留在非阻塞模式下. 这意味着该*File I / O将使用运行时轮询器,而不是单独的线程,并且SetDeadline方法将起作用.

os/signal

The new Ignored function reports whether a signal is currently ignored.

os/user

现在,可以使用构建标签" osusergo "以纯Go模式构建os/user软件包,而与使用环境变量CGO_ENABLED=0 . 以前,使用软件包的纯Go实现的唯一方法是在整个程序中禁用cgo支持.

runtime

现在,设置GODEBUG=tracebackancestors= N环境变量可以扩展使用创建goroutine的堆栈的回溯,其中N限制了要报告的祖先goroutine的数量.

runtime/pprof

此版本添加了一个新的"分配"配置文件类型,该类型描述了自程序开始以来分配的总字节数(包括垃圾收集的字节). 这与在-alloc_space模式下查看的现有"堆"概要文件相同. 现在go test -memprofile=...报告"分配"配置文件而不是"堆"配置文件.

sync

互斥配置文件现在包括RWMutex读写器争用. 互斥配置文件中已包含作家/作家争用.

syscall

在Windows上,为了避免Go的垃圾收集器出现问题,将几个字段从uintptr更改为新的Pointer类型. 对golang.org/x/sys/windows软件包进行了相同的更改. 对于任何受影响的代码,用户应首先从syscall软件包迁移到golang.org/x/sys/windows软件包,然后更改为使用Pointer ,同时遵守unsafe.Pointer转换规则 .

在Linux上,现在与glibc中一样实现Faccessatflags参数. 在早期的Go版本中,flags参数被忽略.

在Linux上,现在已验证Fchmodatflags参数. Linux的fchmodat不支持flags参数,因此我们现在模仿glibc的行为,如果非零则返回错误.

text/scanner

Scanner.Scan方法现在返回RawString令牌而不是String来获取原始字符串文字.

text/template

现在可以通过=标记通过分配修改模板变量:

  {{ $v := "init" }}
  {{ if true }}
    {{ $v = "changed" }}
  {{ end }}
  v: {{ $v }} {{/* "changed" */}}

在以前的版本中,将忽略传递给模板函数的无类型nil值. 现在,它们作为常规参数传递.

time

现在支持解析由符号和偏移量表示的时区. 在以前的版本中,数字时区名称(例如+03 )被认为无效,并且在期望时区名称时仅接受三个字母的缩写(例如MST ).

by  ICOPY.SITE