ARM|Golang 1.17,新功能介绍( 三 )


signal.Notify(c os.Interrupt)
c := make(chan os.Signal)
用户signal.Notify应该使用有足够缓冲空间的通道来跟上预期信号速率 。
Is、As 和 Unwrap 方法的新警告
Vet工具现在会对命名的方法As Is或者Unwrap在实现了erro类型的具有不同签名的接口和预期的errors不匹配时发出警告 。 errors.{AsIsUnwrap功能 实现同样的方法统一实现 , 而非Is(error) bool As(interface{) bool , 活着 Unwrap() error的各自实现 。 errors.{AsIsUnwrap将忽略具有相同的方法名称 , 但签名不同的方法 。例如:
type MyError struct { hint string
func (m MyError) Error() string { ...// MyError实现错误.
func (MyError) Is(target interface{) bool { ...// 目标是interface{而不是错误 。
func Foo() bool {
x y := MyError{\"A\" MyError{\"B\"
return errors.Is(x y) //返回false作为x != y并且 MyError 没有`Is(error) bool`函数
Covercover工具现在使用优化的解析器golang.org/x/tools/cover , 在解析大型覆盖率配置文件时可性能明显加快 。
编译器Go 1.17实现通过使用寄存器而非堆栈保持一种传递函数参数和结果的新方法 。基准测试显示 , 编译性能提升约5% , 并且编译的二进制大小减少约2% 。 该功能目前已在Linux、macOS和Windows 64位架构启用(linux/amd64 darwin/amd64 ,和 windows/amd64) 。
该更改不会影响任何安全Go代码的功能并且旨在对大多数汇编代码没有影响 。但是可能会影响违反的代码这unsafe.Pointer访问函数参数时的规则 , 或者取决于涉及比较函数代码指针的未记录行为 。
为了保持与现有汇编函数的兼容性 , 编译器生成适配器函数 。 在新的基于寄存器的调用约定和之前的基于堆栈的调用约定调用约定 。 这些适配器通常对用户不可见 , 除了汇编代码中Go函数的地址或取地址Go代码中的汇编函数使用reflect.ValueOf(fn).Pointer()或者unsafe.Pointer将返回地址适配器 。 依赖于这些代码指针值的代码可能无法按预期行事 。 适配器也可能在两个方面造成非常小的性能开销案例:通过Go 间接调用汇编函数一种fun值 , 并从程序集中调用Go函数 。
运行时堆栈跟踪的格式(在未捕获的恐慌时打印)发生 , 或当runtime.Stack被称为)得到改进 。 之前 , 函数参数被打印为基于内存的十六进制字布局 。 现在源代码中的每个参数都单独打印 , 分开用逗号 。 聚合类型(结构、数组、字符串、切片、接口和复杂)参数由花括号分隔 。 一个警告是一个的值只存在于寄存器中而不存储到内存中的参数可能是不准确 。函数返回值(通常不准确)不再是打印 。
现在可以内联包含闭包的函数 。 这种变化的一个影响是带有闭包的函数可能为每个地方产生一个不同的闭包代码指针函数是内联的 。 Go函数值不能直接比较 , 但这种变化可能会揭示使用的代码中的错误reflect要么unsafe.Pointer绕过此语言限制并通过代码指针比较函数 。
链接器当链接器使用外部链接模式时 , 默认的链接使用cgo程序时 , 调用链接器与-I选项 , 该选项现在将传递给外部链接器-Wl--dynamic-linker选项 。
核心库Cgoruntime/cgo包现提供了一种允许将任何Go值转换为安全表示的新工具可用于在C和Golang地传递值 。
URL 查询解析net/url和net/http之前接受的\";\"(分号)作为URL查询中的设置分隔符 。 新版本中 , 非百分比编码的设置分号将被拒绝并且net/htt服务器将会对包含分号的请求记录到Server.ErrorLog日志 。
例如 , 在 Go 1.17 之前请求URL:cc?a=1;b=2&c=3会返回map[a:[1
b:[2
c:[3

现在返回为map[c:[3


当遇到这样的查询字符串时 , URL.Query和Request.FormValue忽略任何包含分号的设置 , ParseQuery返回剩余的设置和错误 , 以及Request.ParseForm和 Request.ParseMultipartForm返回错误但仍基于其他配置设置Reques字段 。

相关经验推荐