Go 1.3 Release Notes

Introduction to Go 1.3

最新的Go版本1.3版在1.2之后的六个月内发布,并且不包含任何语言更改. 它主要关注实现工作,提供精确的垃圾回收,对编译器工具链的重大重构,从而加快了构建速度,尤其是对于大型项目,全面改进了性能,并支持DragonFly BSD,Solaris,Plan 9和Google的Native客户端架构(NaCl). 它还对有关同步的内存模型进行了重要改进. 与往常一样,Go 1.3 保证了兼容性 ,并且当移至1.3时,几乎所有内容都将继续编译并运行而无需更改.

Changes to the supported operating systems and architectures

Removal of support for Windows 2000

Microsoft在2010年停止支持Windows2000.由于在异常处理(Unix术语中的信号)方面存在实施方面的困难 ,所以从Go 1.3开始,Go也不支持.

Support for DragonFly BSD

Go 1.3现在包括对amd64 (64位x86)和386 (32位x86)体系结构上的DragonFly BSD的实验支持. 它使用DragonFly BSD 3.6或更高版本.

Support for FreeBSD

当时尚未宣布,但是自Go 1.2发行以来,在FreeBSD上对Go的支持需要FreeBSD 8或更高版本.

从Go 1.3开始,要在FreeBSD上支持Go,需要使用配置的COMPAT_FREEBSD32标志编译内核.

与切换到用于ARM平台的EABI系统调用配合使用,Go 1.3将仅在FreeBSD 10上运行.x86平台386和amd64不受影响.

Support for Native Client

在1.3发行版中,对Native Client虚拟机体系结构的支持已返回到Go. 它可以在32位Intel体系结构( GOARCH=386 )和64位Intel上运行,但是使用32位指针( GOARCH=amd64p32 ). 在ARM上尚不支持Native Client. 请注意,这是本机客户端(NaCl),而不是可移植本机客户端(PNaCl). 有关Native Client的详细信息在这里 ; 如何建立转到版本描述这里 .

Support for NetBSD

从Go 1.3开始,要在NetBSD上支持Go需要NetBSD 6.0或更高版本.

Support for OpenBSD

从Go 1.3开始,在OpenBSD上对Go的支持需要OpenBSD 5.5或更高版本.

Support for Plan 9

Go 1.3现在包括对386 (32位x86)体系结构上的Plan 9的实验支持. 它需要Tsemacquire syscall,自2012年6月以来一直在Plan 9中使用.

Support for Solaris

Go 1.3现在包括对amd64 (64位x86)体系结构上的Solaris的实验性支持. 它需要illumos,Solaris 11或更高版本.

Changes to the memory model

Go 1.3内存模型添加了一条有关在缓冲通道上发送和接收的新规则 ,以明确表明可以将缓冲通道用作简单的信号灯,使用发送到通道中的通道进行获取并从通道中接收以释放通道. 这不是语言的更改,只是对交流的预期属性的澄清.

Changes to the implementations and tools

Stack

Go 1.3已将goroutine堆栈的实现方式从旧的"分段"模型更改为连续模型. 当goroutine需要的堆栈多于可用堆栈时,其堆栈将传输到更大的单个内存块中. 当计算反复跨过段边界时,此转移操作的开销将摊销得很好,并消除了旧的"热点"问题. 包括性能编号的详细信息在此设计文档中 .

Changes to the garbage collector

有一阵子,垃圾收集器在检查堆中的值时非常精确 . Go 1.3版本向堆栈中的值添加了等效的精度. 这意味着非指针Go值(例如整数)将永远不会被误认为是指针,并且可以防止回收未使用的内存.

从Go 1.3开始,运行时假定指针类型的值包含指针,而其他值则不包含指针. 这个假设对于堆栈扩展和垃圾回收的精确行为至关重要. 使用程序包不安全在指针类型的值中存储整数的程序是非法的,如果运行时检测到该行为,则该程序将崩溃. 使用不安全的程序将指针存储在整数类型的值中的程序也是非法的,但在执行过程中更难诊断. 由于指针对运行时是隐藏的,因此堆栈扩展或垃圾回收可能回收它们指向的内存,从而创建了悬空指针 .

更新 :使用unsafe.Pointer将存储在内存中的整数类型的值转换为指针的代码是非法的,必须重写. 可以通过go vet识别此类代码.

Map iteration

小地图上的迭代不再以一致的顺序发生. Go 1定义为" 未指定地图上的迭代顺序,并且不能保证每次迭代之间都相同. 为了避免代码依赖于地图迭代的顺序,Go 1.0在地图中的随机索引处开始了每个地图迭代. Go 1.1中引入的新地图实现忽略了对具有八个或更少条目的地图进行随机化迭代的方法,尽管迭代顺序仍可能因系统而异. 这使人们能够编写依赖于小的地图迭代顺序的Go 1.1和Go 1.2程序,因此只能在某些系统上可靠地工作. Go 1.3重新引入了针对小地图的随机迭代,以清除这些错误.

更新 :如果代码为小地图假定固定的迭代顺序,则它将中断,并且必须重写以不作此假设. 因为只影响小的地图,所以该问题最常出现在测试中.

作为对Go链接器进行全面检修的一部分,编译器和链接器已经过重构. 链接器仍然是C程序,但是现在通过创建一个名为liblink的新库,链接器中的指令选择阶段已移至编译器. 通过仅执行一次指令选择,在首次编译程序包时,这可以大大加快大型项目的编译速度.

更新 :尽管这是内部的重大更改,但对程序没有影响.

Status of gccgo

GCC 4.9版将包含gccgo的Go 1.2(而非1.3)版本. GCC和Go项目的发布时间表不一致,这意味着1.3将在开发分支中可用,但下一个GCC版本4.10可能具有gccgo的Go 1.4版本.

Changes to the go command

The cmd/go command has several new features. The go run and go test subcommands support a new -exec option to specify an alternate way to run the resulting binary. Its immediate purpose is to support NaCl.

现在,启用种族检测器后, go test子命令的测试覆盖率支持go test自动将覆盖率模式设置为-atomic ,以消除有关不安全访问覆盖率计数器的错误报告.

现在,即使没有测试文件, go test子命令也始终会生成软件包. 以前,如果没有测试文件,它将什么都不做.

go build子命令支持新的-i选项,以安装指定目标的依赖性,但不安装目标本身的依赖性.

现在支持启用cgo交叉编译. 运行all.bash时,将使用CC_FOR_TARGET和CXX_FOR_TARGET环境变量分别为C和C ++代码指定交叉编译器.

最后,go命令现在支持通过cgo导入Objective-C文件(后缀.m )的软件包.

Changes to cgo

cmd/cgo命令处理Go软件包中的import "C"声明,已更正了一个严重的错误,该错误可能导致某些软件包停止编译. 以前,所有不完整结构类型的指针都转换为Go类型*[0]byte ,其结果是Go编译器无法诊断将一种结构指针传递给期望另一种结构的函数. Go 1.3通过将每个不同的不完整结构转换为不同的命名类型来纠正此错误.

给定一个不完整的struct S的C声明typedef struct ST ,一些Go代码使用此错误来互换地引用类型C.struct_SCT . Cgo现在明确允许这种用法,即使对于完整的struct类型也是如此. 但是,一些Go代码也使用此错误将*C.FILE从一个包传递到另一个(例如). 这是非法的,并且不再有效:通常,Go软件包应避免在其API中公开C类型和名称.

更新 :代码混淆指向不完整类型的指针或跨包边界传递它们将不再编译,必须重写. 如果转换正确且必须保留,请通过unsafe.Pointer使用显式转换.

SWIG 3.0 required for programs that use SWIG

对于使用SWIG的Go程序,现在需要SWIG 3.0版. cmd/go命令现在将直接将SWIG生成的目标文件链接到二进制文件中,而不是构建和链接共享库.

Command-line flag parsing

在gc工具链中,汇编器现在使用与Go标志包相同的命令行标志解析规则,这与传统的Unix标志解析不同. 这可能会影响直接调用该工具的脚本. 例如,现在必须将go tool 6a -SDfoo编写为go tool 6a -S -D foo . (对Go 1.1中的编译器和链接器进行了相同的更改.)

Changes to godoc

当与调用-analysis标志, godoc现在执行复杂的静态分析它的代码索引. 分析的结果在源代码视图和包文档视图中均显示,并且包括每个包的调用图以及定义和引用,类型及其方法,接口及其实现之间的关系,通道上的发送和接收操作,功能及其呼叫者,以及呼叫站点及其被呼叫者.

Miscellany

用于重写基准测试运行性能的程序misc/benchcmp已被重写. 曾经是主存储库中的shell和awk脚本,现在它是go.tools存储库中的Go程序. 文档在这里 .

For the few of us that build Go distributions, the tool misc/dist has been moved and renamed; it now lives in misc/makerelease, still in the main repository.

Performance

在许多情况下,由于运行时和垃圾回收的更改以及库的某些更改,此版本的Go二进制文件的性能已得到改善. 重要的实例包括:

此外,运行时现在在堆栈转储中包括goroutine被阻止的时间,这对于调试死锁或性能问题很有用.

Changes to the standard library

New packages

新的包debug/plan9obj已添加到标准库. 它实现对Plan 9 a.out对象文件的访问.

Major changes to the library

crypto/tls先前错误使无意中跳过TLS验证成为可能. 在Go 1.3中,该错误已修复:必须指定ServerName或InsecureSkipVerify,并且如果指定了ServerName,则将其强制执行. 这可能会破坏不正确地依赖于不安全行为的现有代码.

标准库中添加了一个重要的新类型: sync.Pool . 它提供了一种有效的机制来实现某些类型的缓存,这些缓存的内存可以由系统自动回收.

testing包的基准测试帮助程序B现在具有RunParallel方法,使运行多个CPU的基准测试更加容易.

正在更新 :crypto / tls修复程序可能会破坏现有代码,但此类代码是错误的,应进行更新.

Minor changes to the library

下表总结了对该库的一些较小更改,主要是新增内容. 有关每个更改的更多信息,请参见相关的软件包文档.

by  ICOPY.SITE