Go 1.6 Release Notes

Introduction to Go 1.6

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

该发行版为Linux(在64位MIPS上)和Android(在32位x86上)添加了新的端口; 为与C共享Go指针定义和实施规则 ; 透明,自动支持HTTP / 2 ; 和一种新的模板重用机制.

Changes to the language

此版本中没有语言更改.

Ports

Go 1.6在64位MIPS( linux/mips64linux/mips64le )上为Linux添加了实验端口. 这些端口支持cgo但仅支持内部链接.

Go 1.6还在32位x86( android/386 )上为Android添加了实验端口.

在FreeBSD上,Go 1.6默认使用clang而不是gcc作为外部C编译器.

在运行于linux/ppc64le 64位PowerPC的linux/ppc64lelinux/ppc64le )上的Linux上,Go 1.6现在支持带有外部链接的cgo ,并且功能大致已完成.

在NaCl上,Go 1.5需要SDK版本Pepper-41. Go 1.6添加了对更高版本SDK的支持.

上使用32位x86系统-dynlink-shared编译模式,寄存器CX现在由某个存储器的引用重写,应在手写组件来避免. 有关详细信息,请参见组装文档 .

Tools

Cgo

cgo有一项重大更改,而另一项则是次要更改.

主要更改是定义了与C代码共享Go指针的规则的定义,以确保此类C代码可以与Go的垃圾回收器共存. 简而言之,当内存的指针作为cgo调用的一部分传递给C时,Go和C可以共享Go分配的内存,前提是该内存本身不包含指向Go分配的内存的指针,并且前提是C不保留Go分配的内存.调用返回后的指针. 这些规则由运行时在程序执行期间检查:如果运行时检测到违规,它将打印诊断并使程序崩溃. 可以通过设置环境变量GODEBUG=cgocheck=0来禁用检查,但是请注意,检查所标识的绝大多数代码以一种或另一种方式与垃圾回收巧妙地不兼容. 禁用检查通常只会导致更多神秘的故障模式. 修复有问题的代码比关闭检查更为可取. 有关更多详细信息,请参见cgo文档 .

The minor change is the addition of explicit C.complexfloat and C.complexdouble types, separate from Go's complex64 and complex128. Matching the other numeric types, C's complex types and Go's complex type are no longer interchangeable.

Compiler Toolchain

编译器工具链基本保持不变. 在内部,最重要的变化是解析器现在是手写的,而不是从yacc生成的.

编译器,链接器和go命令具有一个新的-msan标志,类似于-race并且仅在linux / amd64上可用,该标志允许与Clang MemorySanitizer互操作. 这种互操作主要用于测试包含可疑C或C ++代码的程序.

链接器具有一个新选项-libgcc用于在链接cgo代码时设置C编译器支持库的预期位置. 仅当使用-linkmode=internal时才可以-linkmode=internal该选项,并且可以将其设置为none以禁用对支持库的使用.

从Go 1.5开始构建模式的实现已扩展到更多系统. 这个版本增加了对android/386android/amd64android/arm64linux/386linux/arm64上的c-shared模式的支持; 用于linux/386linux/armlinux/amd64linux/ppc64le上的shared模式; 并针对android/386android/amd64android/armandroid/arm64linux/386linux/amd64linux/armlinux/arm64linux/ppc64le的新pie模式(生成与位置无关的可执行文件) . 有关详细信息,请参见设计文档 .

提醒一下,链接器的-X标志在Go 1.5中已更改. 在Go 1.4和更低版本中,它采用了两个参数,例如

-X importpath.name value

Go 1.5使用一个单独的参数添加了另一种语法,该参数本身就是一个name=value对:

-X importpath.name=value

在Go 1.5中,在打印警告提示使用新语法后,旧语法仍被接受. Go 1.6继续接受旧语法并打印警告. Go 1.7将删除对旧语法的支持.

Gccgo

GCC和Go项目的发布时间表不一致. GCC版本5包含gccgo的Go 1.4版本. 下一版本GCC 6将具有gccgo的Go 1.6.1版本.

Go command

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

Go 1.5通过将GO15VENDOREXPERIMENT环境变量设置为1引入了对供应商的实验性支持. Go 1.6保留了不再支持的供应商支持,并且默认情况下启用了它. 可以通过将GO15VENDOREXPERIMENT环境变量设置为0来显式禁用它. Go 1.7将删除对环境变量的支持.

默认情况下,由启用默认vendor引起的最可能出现的问题发生在包含名为" vendor的现有目录的源树中,该目录不希望根据新的vendor语义进行解释. 在这种情况下,最简单的解决方法是将目录重命名为除vendor以外的任何名称,并更新所有受影响的导入路径.

有关供应的详细信息,请参阅go命令文档设计文档 .

有一个新的生成标志-msan ,它使用对LLVM内存清理程序的支持来编译Go. 这主要用于与正在使用内存清理程序检查的C或C ++代码链接时使用.

Go doc command

Go 1.5引入了go doc命令,该命令只允许使用软件包名称来引用软件包,如go doc http . 万一出现歧义,Go 1.5的行为是按字典顺序最早的导入路径使用该软件包. 在Go 1.6中,通过使用较少元素的导入路径来解决歧义,并使用字典比较法打破了束缚. 此更改的重要影响是,现在首选软件包的原始副本,而不是供应商的副本. 成功的搜索也往往运行得更快.

Go vet command

现在, go vet命令会将传递函数或方法值诊断为Printf参数,例如将f()传递给f时.

Performance

与往常一样,这些更改是如此笼统和多变,以至于很难对性能进行精确的表述. 有些程序可能运行得更快,有些则运行得更慢. 平均而言,Go 1基准套件中的程序在Go 1.6中的运行速度比Go 1.5中的运行速度快百分之几. 垃圾回收器的暂停时间甚至比Go 1.5中的暂停时间少,尤其是对于使用大量内存的程序.

进行了重大的优化,对compress/bzip2compress/gzipcrypto/aescrypto/ellipticcrypto/ecdsasort包的实现带来了10%以上的改进.

Core library

HTTP/2

Go 1.6在net/http包中添加了对新HTTP / 2协议的透明支持. 使用HTTPS时,Go客户端和服务器将根据需要自动使用HTTP / 2. 没有针对HTTP / 2协议处理细节的导出API,就像没有针对HTTP / 1.1的导出API一样.

必须禁用HTTP / 2的程序可以通过将Transport.TLSNextProto (对于客户端)或Server.TLSNextProto (对于服务器)设置为非空的空映射来执行此操作.

Programs that must adjust HTTP/2 protocol-specific details can import and use golang.org/x/net/http2, in particular its ConfigureServer and ConfigureTransport functions.

Runtime

运行时增加了轻巧,尽力而为的检测并发滥用地图的功能. 与往常一样,如果一个goroutine正在写入地图,则其他goroutine不应同时读取或写入地图. 如果运行时检测到这种情况,它将打印诊断并使程序崩溃. 找出更多有关该问题的最佳方法是在" 种族检测器"下运行该程序,这将更可靠地识别种族并提供更多详细信息.

对于程序结尾的紧急情况,现在默认情况下,运行时现在仅打印正在运行的goroutine的堆栈,而不是所有现有的goroutine. 通常,只有当前的goroutine与紧急情况相关,因此省略其他goroutine会大大减少崩溃消息中无关的输出. 要查看崩溃消息中所有goroutine的堆栈,请将环境变量GOTRACEBACK设置为all或在崩溃之前调用debug.SetTraceback ,然后重新运行该程序. 有关详细信息,请参见运行时文档 .

更新 :打算转储整个程序状态的未解决恐慌(例如,当检测到超时或显式处理接收到的信号时)现在应在恐慌之前调用debug.SetTraceback("all") . 搜索信号的使用signal.Notify可能有助于识别此类代码.

在Windows上,Go 1.5及更早版本中的Go程序通过调用timeBeginPeriod(1)在启动时将全局Windows计时器分辨率强制为1ms. Go不再需要此命令来获得良好的调度程序性能,并且更改全局计时器分辨率会在某些系统上引起问题,因此该呼叫已删除.

当使用-buildmode=c-archive-buildmode=c-shared生成归档文件或共享库时,信号的处理已更改. 在Go 1.5中,归档文件或共享库将为大多数信号安装信号处理程序. 在Go 1.6中,它将仅为处理Go代码中的运行时紧急情况所需的同步信号安装信号处理程序:SIGBUS,SIGFPE,SIGSEGV. 有关更多详细信息,请参见os / signal软件包.

Reflect

The reflect package has resolved a long-standing incompatibility between the gc and gccgo toolchains regarding embedded unexported struct types containing exported fields. Code that walks data structures using reflection, especially to implement serialization in the spirit of the encoding/json and encoding/xml packages, may need to be updated.

使用反射将嵌入的未导出结构类型的字段遍历到该结构的导出字段时,会出现问题. 在这种情况下, reflect通过返回一个空的Field.PkgPath ,错误地将嵌入式字段报告为已导出. 现在,它正确地将字段报告为未导出,但是在评估对结构中包含的已导出字段的访问权限时,忽略了这一事实.

更新 :通常,以前遍历结构并使用的代码

f.PkgPath != ""

排除不可访问的字段,现在应该使用

f.PkgPath != "" && !f.Anonymous

例如,请参阅对encoding/jsonencoding/xml实现的更改.

Sorting

sort包中,对Sort的实现进行了重写,以使对InterfaceLessSwap方法的调用减少大约10%,并节省了相应的总体时间. 对于比较相等的值( Less(i, j)Less(j, i)为假的那些对),新算法的确选择了与以前不同的排序.

更新Sort的定义不能保证最终值相等的顺序,但是新行为可能仍会破坏期望特定顺序的程序. 此类程序应完善其Less实现以报告所需的顺序,或者应切换到Stable ,以保留相等值的原始输入顺序.

Templates

文本/模板包中,有两个重要的新功能使编写模板更加容易.

首先,现在可以在模板操作周围修剪空间 ,这可以使模板定义更具可读性. 动作开始时的减号表示在动作之前修剪空间,动作结束时的减号表示在动作之后修剪空间. 例如,模板

{{23 -}}
   <
{{- 45}}

格式为23<45 .

其次,新的{{block}}操作结合允许重新定义命名模板,提供了一种简单的方法来定义可在不同实例中替换的模板片段. text/template包中有一个示例演示了此新功能.

Minor changes to the library

by  ICOPY.SITE