Go 1.12 Release Notes

Introduction to Go 1.12

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

Changes to the language

语言规范没有变化.

Ports

种族检测器现在在linux/arm64上受支持.

Go 1.12是FreeBSD 10.x支持的最后一个发行版,已经到期了. Go 1.13将需要FreeBSD 11.2+或FreeBSD 12.0+. FreeBSD 12.0+需要一个带有COMPAT_FREEBSD11选项集的内核(这是默认设置).

linux/ppc64现在支持cgo.

hurd现在是GOOS的公认值,保留给GNU / Hurd系统以与gccgo一起使用.

Windows

Go的新windows/arm端口支持在Raspberry Pi 3等32位ARM芯片上的Windows 10 IoT核心版上运行Go.

AIX

Go现在在POWER8体系结构( aix/ppc64 )上支持AIX 7.2和更高版本. 尚不支持外部链接,cgo,pprof和竞争检测器.

Darwin

Go 1.12是将在macOS 10.10 Yosemite上运行的最新版本. Go 1.13需要macOS 10.11 El Capitan或更高版本.

在达尔文进行系统调用时,现在使用libSystem ,以确保与未来版本的macOS和iOS向前兼容. 切换到libSystem触发了其他App Store检查私有API使用情况. 由于它被认为是私有的,因此syscall.Getdirentries现在始终会在iOS上因ENOSYS失败. 另外, syscall.Setrlimit在历史上成功的地方报告invalid argument . 这些后果并不是特定于Go的,用户应该期望与libSystem的实现在行为上保持一致.

Tools

go tool vet no longer supported

go vet命令已被重写,可以用作各种不同源代码分析工具的基础. 有关详细信息,请参见golang.org/x/tools/go/analysis软件包. 副作用是不再支持go tool vet . 必须将使用go tool vet外部工具更改为使用go vet . 使用go vet代替go tool vet应该适用于所有受支持的Go版本.

作为此更改的一部分, go vet不再提供实验性-shadow选项. 现在可以使用以下方法检查变量阴影

go get -u golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
go vet -vettool=$(which shadow)

Tour

Go巡回演出不再包含在主要的二进制发行版中. 要在本地运行游览,而不是运行go tool tour ,请手动安装它:

go get -u golang.org/x/tour
tour

Build cache requirement

The build cache is now required as a step toward eliminating $GOPATH/pkg. Setting the environment variable GOCACHE=off will cause go commands that write to the cache to fail.

Binary-only packages

Go 1.12是最后一个仅支持二进制包的发行版.

Cgo

Go 1.12会将C类型的EGLDisplay转换为Go类型的uintptr . 此更改类似于Go 1.10和更高版本如何处理Darwin的CoreFoundation和Java的JNI类型. 有关更多信息,请参见cgo文档 .

使用Cgo的软件包不再接受C语言名称混乱的问题. 请改用Cgo名称. 例如,使用记录的cgo名称C.char而不是cgo生成的名称_Ctype_char .

Modules

GO111MODULE设置为ongo命令现在支持模块目录外部的模块感知操作,前提是这些操作不需要解析相对于当前目录的导入路径或显式编辑go.mod文件. 诸如go getgo listgo mod download行为就像在具有最初为空的要求的模块中一样. 在这种模式下, go env GOMOD报告系统的空设备( /dev/nullNUL ).

现在可以安全地同时调用下载和提取模块的go命令. 模块缓存( GOPATH/pkg/mod )必须驻留在支持文件锁定的文件系统中.

go.mod文件中的go指令现在指示该模块中文件使用的语言版本. 如果不存在现有版本,它将设置为当前发行版( go 1.12 ). 如果模块的go指令指定的版本比使用中的工具链更新 ,则go命令将尝试构建软件包,无论如何,并且仅在构建失败的情况下才注意不匹配.

更改了go指令的用法意味着,如果您使用Go 1.12来构建模块,从而将go 1.12记录在go.mod文件中,则在尝试使用Go 1.11到Go 1.11.3来构建相同的模块时,将会收到错误消息. . Go 1.11.4或更高版本可以正常工作,而Go 1.11之前的版本也可以. 如果必须使用Go 1.11到1.11.3,则可以使用Go 1.12 go工具通过go mod edit -go=1.11将语言版本设置为1.11,从而避免出现此问题.

当使用活动模块无法解决导入问题时, go命令现在将尝试使用主模块的replace指令中提到的模块,然后再咨询模块缓存和常规网络源. 如果找到了匹配的更换,但replace指令不指定版本,在go命令使用源自零伪版本time.Time (如v0.0.0-00010101000000-000000000000 ).

Compiler toolchain

编译器的实时变量分析得到了改进. 这可能意味着终结器将在此版本中比以前的版本中执行得更快. 如果有问题,请考虑适当添加runtime.KeepAlive调用.

现在,默认情况下,更多函数可以进行内联,包括仅调用另一个函数就不起任何作用的函数. 这种额外的内联使得使用runtime.CallersFrames而不是直接遍历runtime.Callers的结果变得runtime.CallersFrames重要.

// Old code which no longer works correctly (it will miss inlined call frames).
var pcs [10]uintptr
n := runtime.Callers(1, pcs[:])
for _, pc := range pcs[:n] {
	f := runtime.FuncForPC(pc)
	if f != nil {
		fmt.Println(f.Name())
	}
}
// New code which will work correctly.
var pcs [10]uintptr
n := runtime.Callers(1, pcs[:])
frames := runtime.CallersFrames(pcs[:n])
for {
	frame, more := frames.Next()
	fmt.Println(frame.Function)
	if !more {
		break
	}
}

runtime.CallersFramesruntime.Stack不再报告由编译器生成的用于实现方法表达式的包装器. 它们也不会以紧急堆栈痕迹打印. 此更改使gc工具链与gccgo工具链对齐,该gccgo工具链已从堆栈跟踪中消除了此类包装器. 这些API的客户端可能需要针对丢失的帧进行调整. 对于必须在1.11和1.12版本之间进行互操作的代码,可以用函数文字func (...) { xM(...) }替换方法表达式xM .

编译器现在接受-lang标志来设置要使用的Go语言版本. 例如,如果程序使用在Go 1.9中添加的类型别名,则-lang=go1.8会导致编译器发出错误. 在Go 1.12之前进行的语言更改未得到一致实施.

编译器工具链现在使用不同的约定来调用Go函数和汇编函数. 对于用户而言,这应该是不可见的,但同时在Go和Assembly之间交叉并且跨越程序包边界的调用除外. 如果链接导致诸如"未为ABIInternal定义重定位目标(但为ABI0定义)的定位目标"之类的错误,请参考ABI设计文档的兼容性部分 .

对编译器生成的DWARF调试信息进行了许多改进,包括对参数打印和变量位置信息的改进.

Go程序现在还在linux/arm64上维护堆栈框架指针,以利用诸如perf之类的性能分析工具. 帧指针维护的运行时开销很小,虽然有所不同,但平均约为3%. 要构建不使用框架指针的工具链, GOEXPERIMENT=noframepointer在运行make.bash时设置GOEXPERIMENT=noframepointer make.bash .

已删除过时的"安全"编译器模式(由-u gcflag启用).

godoc and go doc

在Go 1.12中, godoc不再具有命令行界面,而只是Web服务器. 用户应改用go doc作为命令行帮助输出. Go 1.12是最后一个包含godoc网络服务器的版本; 在Go 1.13中,可以通过go get .

go doc现在支持-all标志,这将使其像godoc命令行一样打印所有导出的API及其文档.

go doc现在还包含-src标志,该标志将显示目标的源代码.

Trace

跟踪工具现在支持绘制mutator利用率曲线,包括对执行跟踪的交叉引用. 这些对于分析垃圾收集器对应用程序延迟和吞吐量的影响很有用.

Assembler

On arm64, the platform register was renamed from R18 to R18_PLATFORM to prevent accidental use, as the OS could choose to reserve this register.

Runtime

当大部分堆保持活动状态时,Go 1.12显着提高了清除性能. 这样可以减少垃圾回收后立即分配的延迟.

Go运行时现在可以更积极地将内存释放回操作系统,特别是对无法重用现有堆空间的大型分配的响应.

Go运行时的计时器和截止日期代码更快,并且随着CPU数量的增加,可扩展性更好. 特别是,这提高了操纵网络连接期限的性能.

On Linux, the runtime now uses MADV_FREE to release unused memory. This is more efficient but may result in higher reported RSS. The kernel will reclaim the unused data when it is needed. To revert to the Go 1.11 behavior (MADV_DONTNEED), set the environment variable GODEBUG=madvdontneed=1.

添加cpu. 现在,对GODEBUG环境变量的extension = off禁用了在标准库和运行时中使用可选的CPU指令集扩展. Windows尚不支持此功能.

Go 1.12通过修复大量堆分配的计数过高问题,提高了内存配置文件的准确性.

回调, runtime.Callerruntime.Callers不再包含编译器生成的初始化函数. 现在在初始化全局变量期间进行回溯将显示一个名为PKG.init.ializers的函数.

Core library

TLS 1.3

Go 1.12按照RFC 8446的规定在crypto/tls包中添加了对TLS 1.3的选择加入支持. 可以通过将值tls13=1添加到GODEBUG环境变量来启用它. 默认情况下,它将在Go 1.13中启用.

要协商TLS 1.3,请确保未在Config设置显式的MaxVersion ,并在Config了环境变量GODEBUG=tls13=1运行程序.

TLS 1.3中提供了ConnectionState TLSUnique和重新协商之外的所有TLS 1.2功能,并提供了等效或更好的安全性和性能. 请注意,即使TLS 1.3与以前的版本向后兼容,某些传统系统在尝试进行协商时也可能无法正常工作. 太小而无法保证安全的RSA证书密钥(包括512位密钥)将不适用于TLS 1.3.

TLS 1.3密码套件不可配置. 所有受支持的密码套件都是安全的,并且如果在ConfigConfigPreferServerCipherSuites则优先顺序基于可用的硬件.

当前不支持早期数据(也称为" 0-RTT模式")作为客户端或服务器. 此外,如果客户端发送了数据,Go 1.12服务器不支持跳过意外的早期数据. 由于TLS 1.3 0-RTT模式涉及客户端保持有关哪些服务器支持0-RTT的状态,因此Go 1.12服务器不能成为某些其他服务器确实支持0-RTT的负载平衡池的一部分. 如果将域从支持0-RTT的服务器切换到Go 1.12服务器,则必须在切换前至少在已颁发会话票证的生存期内禁用0-RTT,以确保不中断操作.

在TLS 1.3中,客户端是握手中最后一个要讲话的客户端,因此,如果它导致服务器上发生错误,它将在客户端通过第一个Read而不是Handshake . 例如,如果服务器拒绝客户端证书,则将是这种情况. 同样,会话票证现在是握手后的消息,因此仅在客户端第一次Read时才被接收.

Minor changes to the library

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

bufio

如果在Peek之后调用ReaderUnreadRuneUnreadByte方法,则将返回错误.

bytes

新函数ReplaceAll返回一个字节片的副本,该字节片的值的所有非重叠实例都被另一个替换.

现在,指向零值Reader指针在功能上等效于NewReader (nil) . 在Go 1.12之前,不能在所有情况下使用前者替代后者.

crypto/rand

现在将在第一次Reader.Read将警告信息打印为标准错误Reader.Read被阻止60秒钟以上,等待从内核读取熵.

在FreeBSD上, Reader现在使用getrandom系统调用(如果可用),否则使用/dev/urandom .

crypto/rc4

此版本删除了程序集实现,仅保留纯Go版本. Go编译器生成的代码根据CPU的不同而有所不同. RC4是不安全的,仅应用于与旧系统兼容.

crypto/tls

如果客户端发送的初始消息看起来不像TLS,则服务器将不再发出警报,并且它将在net.Conn的新字段Conn中公开基础RecordHeaderError .

database/sql

现在可以通过将*Rows值传递给Row.Scan方法来获取查询游标.

expvar

新的Delete方法允许从Map删除键/值对.

fmt

现在可以按键排序的顺序打印地图,以简化测试. 排序规则是:

  • 适用时,nil比较低
  • 整数,浮点数和字符串按<
  • NaN比非NaN浮点数少
  • 布尔比较假之前为真
  • 复杂比较真实,然后虚构
  • 指针按机器地址比较
  • 通道值按机器地址比较
  • 结构依次比较每个字段
  • 数组依次比较每个元素
  • 接口值首先通过描述具体类型的reflect.Type进行比较,然后再按照先前规则中的具体值进行比较.

打印地图时,非自反键值(如NaN )以前显示为<nil> . 从此版本开始,将打印正确的值.

go/doc

为了解决cmd/doc某些未解决问题,此程序包具有一个新的ModePreserveAST ,它控制是否清除AST数据.

go/token

File类型具有一个新的LineStart字段,该字段返回给定行的开始位置. 这在偶尔处理非Go文件的程序(例如程序集)中但希望使用token.Pos机制标识文件位置的程序特别有用.

image

现在, RegisterFormat函数可以安全地并发使用.

image/png

现在,少于16种颜色的调色板图像会编码为较小的输出.

io

新的StringWriter接口包装了WriteString函数.

math

现在,函数SinCosTanSincos将Payne-Hanek范围缩小应用于庞大的参数. 这将产生更准确的答案,但它们与早期版本中的结果将一点一点地不同.

math/bits

uintuint32uint64版本提供了新的扩展精度操作AddSubMulDiv .

net

Dialer.DualStack设置现在已被忽略和弃用; 现在默认情况下启用RFC 6555快速回退("快乐眼球"). 若要禁用,请将Dialer.FallbackDelay设置为负值.

同样,如果Dialer.KeepAlive为零,则默认情况下现在启用TCP保持活动状态. 要禁用,请将其设置为负值.

在Linux上, splice系统调用现在使用从复制时UnixConnTCPConn .

net/http

HTTP服务器现在拒绝带有纯文本" 400 Bad Request"响应的对HTTPS服务器的错误定向的HTTP请求.

新的Client.CloseIdleConnections方法调用Client的基础TransportCloseIdleConnections如果有).

Transport不再拒绝声明HTTP尾部但不使用分块编码的HTTP响应. 相反,现在仅忽略声明的预告片.

Transport不再像在Go 1.10和Go 1.11中一样严格处理从HTTP / 2服务器通告的MAX_CONCURRENT_STREAMS值. 现在,默认行为回到Go 1.9中的状态:与服务器的每个连接最多可以激活MAX_CONCURRENT_STREAMS请求,然后根据需要创建新的TCP连接. 在Go 1.10和Go 1.11中, http2包将阻止并等待请求完成,而不是创建新连接. 要恢复更严格的行为,请直接导入golang.org/x/net/http2包,并将Transport.StrictMaxConcurrentStreams设置为true .

net/url

ParseParseRequestURIURL.Parse现在返回包含ASCII控制字符的URL的错误,其中包括NULL,制表符和换行符.

net/http/httputil

ReverseProxy现在可以自动代理WebSocket请求.

os

新的ProcessState.ExitCode方法返回流程的退出代码.

ModeCharDevice已添加到ModeType位掩码中,从而允许ModeDevice | ModeCharDevice ModeDevice | ModeCharDevice屏蔽FileMode时要恢复的ModeType .

新函数UserHomeDir返回当前用户的主目录.

在大多数Unix系统上, RemoveAll现在支持长度超过4096个字符的路径.

File.Sync现在在macOS上使用F_FULLFSYNC将文件内容正确刷新到永久存储中. 这可能会导致该方法的运行速度比以前的版本慢.

File现在支持返回syscall.RawConn接口值的SyscallConn方法. 这可用于在底层文件描述符上调用系统特定的操作.

path/filepath

现在,当在Windows上传递诸如NUL的保留文件名时, IsAbs函数将返回true. 保留名称列表.

reflect

A new MapIter type is an iterator for ranging over a map. This type is exposed through the Value type's new MapRange method. This follows the same iteration semantics as a range statement, with Next to advance the iterator, and Key/Value to access each entry.

regexp

不再需要Copy来避免锁争用,因此已为它提供了部分弃用注释. 如果使用复印件的原因是要使用不同的Longest设置制作两份复印件,则该Copy仍然适用.

runtime/debug

一种新的BuildInfo类型公开从运行的二进制文件读取的构建信息,该信息仅在使用模块支持构建的二进制文件中可用. 这包括主程序包路径,主模块信息和模块依赖性. 这种类型是通过ReadBuildInfo上的ReadBuildInfo函数BuildInfo .

strings

新函数ReplaceAll返回一个字符串的副本,该字符串的所有非重叠实例都由另一个替换.

现在,指向零值Reader指针在功能上等效于NewReader (nil) . 在Go 1.12之前,不能在所有情况下使用前者替代后者.

The new Builder.Cap method returns the capacity of the builder's underlying byte slice.

字符映射函数MapTitleToLowerToLowerSpecialToTitleToTitleSpecialToUpperToUpperSpecial现在始终保证返回有效的UTF-8. 在较早的版本中,如果输入是无效的UTF-8,但是不需要应用任何字符替换,则这些例程会错误地返回未经修改的无效UTF-8.

syscall

FreeBSD 12现在支持64位inode.一些类型已经相应调整.

现在,兼容版本的Windows支持Unix套接字( AF_UNIX )地址系列.

Windows已引入了新功能Syscall18 ,它允许使用最多18个参数的调用.

syscall/js

Callback类型和NewCallback函数已重命名; 它们现在分别称为FuncFuncOf . 这是一个重大变化,但是WebAssembly支持仍处于试验阶段,尚未遵循Go 1兼容性承诺 . 使用旧名称的任何代码都需要更新.

如果某个类型实现了新的Wrapper接口,则ValueOf将使用它返回该类型的JavaScript值.

Value的含义已更改. 现在,它表示JavaScript undefined值,而不是数字0. 这是一个重大变化,但是WebAssembly支持仍处于试验阶段,尚未遵循Go 1兼容性承诺 . 任何依赖零Value表示数字零的代码都需要更新.

新的Value.Truthy方法报告给定值的JavaScript"真实性" .

testing

-benchtime标志现在支持设置一个显式的迭代计数,而不是值以" x "结尾的时间. 例如, -benchtime=100x运行基准100次.

text/template

执行模板时,长上下文值不会再被错误截断.

executing "tmpl" at <.very.deep.context.v...>: map has no entry for key "notpresent"

就是现在

executing "tmpl" at <.very.deep.context.value.notpresent>: map has no entry for key "notpresent"

如果用户定义的函数由模板恐慌调用,则ExecuteExecuteTemplate方法现在会捕获该恐慌并将其作为错误返回.

time

$GOROOT/lib/time/zoneinfo.zip的时区数据库已更新为版本2018i. 请注意,仅当操作系统未提供时区数据库时才使用此ZIP文件.

unsafe

将nil unsafe.Pointer转换为uintptr并用算术返回是无效的. (这已经无效,但是现在将导致编译器行为异常.)

by  ICOPY.SITE