去1.17 beta

2021-06-11 02:59:19

1.17尚未释放1.17。这些是正在进行的工作发布说明。 GO 1.17预计将于2021年8月发布。

从切片到数组指针的转换:[] t的表达式现在可以转换为阵列指针类型* [n] t。如果a是这种转换的结果,则在范围内的相应指标是指相同的基础元素:&amp; a [i] ==&amp; s [i] 0 <= i&lt; N.如果LEN(S)小于N.,则转换速度

UNSEAFE.ADD:UNSEAK.ADD(PTR,LEN)将LEN添加到PTR并返回更新的指针UNSEW.POINTER(UINTPTR(PTR)+ UINTPTR(LEN))。

UNSEASE.SLICE:对于类型* T的表达式PTR,UNSEAKE.SLICE(PTR,LEN)返回一片类型[] T的底层数组在PTR处启动,其长度和容量是LEN。

添加了这些增强功能以​​简化符合不安全的书写代码.Pointer&#39; S安全规则,但规则保持不变。特别是,正确使用UNSAWE.POINTER的现有程序仍然有效,并且使用UNSEASE.ADD或UNSEAFE.SLICE时仍必须遵循规则。

请注意,从切片到数组指针的新转换是第一种在运行时可以恐慌的情况。应更新假设类型转换的分析工具,应该更新,以考虑这种可能性。

如在Go 1.16发行说明中宣布,Go 1.17需要Macos 10.13高塞拉或更高版本;已停止对以前版本的支持。

Go 1.17在Windows(Windows / ARM64端口)上增加了64位ARM架构的支持。此端口支持CGO。

在GO 1.16中,OpenBSD上的64位X86和64位ARM架构(OpenBSD / AMD64和OpenBSD / ARM64端口)系统调用是通过LIBC进行的,而不是直接使用机器指令。在Go 1.17,这也在OpenBSD上的32位X86和32位ARM架构上进行(OpenBSD / 386和OpenBSD / ARM端口)。这可确保与未来OpenBSD版本的转发兼容性,特别是OpenBSD 6.9,这需要通过Libc进行系统调用以获取非静态Go二进制文件。

GO程序现在在所有操作系统上维护在64位ARM架构上的堆栈帧指针。以前,它仅在Linux,MacOS和iOS上维护堆栈帧指针。

如果模块在其go.mod文件中指定了1.17或更高版本,则其传递要求现在懒惰地加载,避免需要下载或读取Go.mod文件以获取其他无关依赖项。为了支持延迟加载,在Go 1.17模块中,Go命令在Go.mod文件中保持明确的要求,每个依赖项都提供了通过模块内的任何包或测试中的任何包裹导入的任何程序包。有关详细信息,请参阅设计文档。

由于Go.mod文件中的其他显式要求的数量可能是大量的,因此在GO 1.17模块中,对间接依赖项的新添加要求在包含直接依赖的块的单独要求块中维护。

为了促进升级到延迟加载,Go Mod整洁子命令现在支持-go标志来设置或更改Go.mod文件中的Go版本。要为现有模块启用延迟加载,而无需更改所选版本的依赖项,请运行:

默认情况下,Go Mod整洁验证与主模块相关的所选版本的依赖关系是与先前的Go释放(Go 1.16用于Spsecifies Go 1.17)的相同版本,并保留Go.Sum条目即使对于其他命令通常不需要的依赖项,也需要该释放。

-compat标志允许覆盖该版本来支持较旧的(或仅更新)版本,最多于Go.mod文件中的Go指令指定的版本。仅为Go 1.17模块进行Go 1.17,而不保存校验和(或检查一致性)Go 1.16:

请注意,即使主模块与-compat = 1.17整合,需要从Go 1.16或更早的模块中需要模块的用户仍然可以使用它,只要软件包仅使用兼容的语言和库功能即可。

模块作者可以通过添加//弃用:评论到go.mod,然后标记新版本来弃用模块。如果不推荐使用要在命令行中命名的软件包所需的模块,请立即打印警告。 go list -m -u打印所有依赖项的弃弃(使用-f或-json显示完整消息)。 Go命令认为不同的主要版本是不同的模块,因此可以使用此机制,例如,为用户提供新的主要版本的迁移指令。

弃用Go Get -Insecure标志并已删除。要允许在获取依赖项时使用不安全方案,请使用GoIsecure环境变量。如果您需要该功能,则绕过模块总和验证,请绕过模块总和验证,使用goprivate或gonosumdb。有关详细信息,请参阅GO帮助环境。

如果主模块&#39; s go.mod文件不包含go指令并且go命令无法更新go.mod文件,则Go命令现在假定Go 1.11而不是当前版本。 (Go Mod Init从1.12开始自动添加Go指令。)

如果模块依赖项缺少显式go.mod文件,或者它的go.mod文件不包含Go指令,则Go命令现在假定该依赖性而不是当前版本。 (GoPath模式中开发的依赖项可能缺少Go.mod文件,并且vendor / modules.txt必须迄今为止从未记录过依赖关系和#39所示的Go版本; Go.mod文件。)

如果主模块指定Go 1.17或更高版本,则Go Mod供应商现在使用每个Vendored模块指示的Go版本以其自己的Go.mod文件注释给vendor / modules.txt。在从助源代码中构建模块&#39; s软件包时使用注释版本。

如果主模块指定Go 1.17或更高版本,则of Mod供应商现在省略Go.mod和go.sum文件,用于vendered依赖项,否则可能会干扰go命令在供应商树中调用时识别正确的模块根目录的能力。

默认情况下,Go命令禁止SSH密码提示和Git凭证管理器在使用SSH获取Git存储库时提示,因为它已经为其他Git密码提示进行了。使用受密码保护SSH的私有GIT Repos验证的用户可以配置SSH代理以启用Go命令以使用受密码保护的SSH键。

在没有参数的情况下调用Go Mod下载时,它将不再将下载的模块内容保存到go.sum。它仍可能更改Go.mod和go.sum需要加载构建列表。这与1.15中的行为相同。要为所有模块保存和,请使用Go Mod下载全部。

Go命令现在了解// go:构建行并更喜欢它们超过// +构建线。新的语法使用布尔表达式,就像go一样,并且应该减少错误。正如此版本所示,新语法完全支持,并且应该更新所有Go文件,以具有相同含义的两种表单。为了帮助迁移,GOFMT现在自动同步两种形式。有关语法和迁移计划的更多详细信息,请参阅https://golang.org/design/draft-gobuild。

GOFMT(和GO FMT)现在同步// GO:使用// +构建行构建行。如果文件只有// +构建行,则它们将被移动到文件中的相应位置,并匹配// go:将添加构建线。否则,// +构建线将基于任何现有// go覆盖:构建行。有关更多信息,请参阅https://golang.org/design/draft-gobuild。 vet工具现在验证// go:build和// +构建行位于文件的正确部分并彼此同步。如果他们aren&#39; t,gofmt可用于修复它们。有关更多信息,请参阅https://golang.org/design/draft-gobuild。

兽医工具现在警告呼叫信号。通过将传入信号发送到未禁止的通道。使用无缓冲的频道风险丢失在它们上发送的信号作为信号。发送到通道时不会阻止。例如:

C:= make(Chan OS.Signal)//在读取频道的C中发送信号//信号。//此信号可以丢弃,因为C是不禁止的。徽章.Notify(C,OS.interruct)

信号的用户.Notify应该使用具有足够缓冲空间的通道来跟上预期的信号速率。

vet工具现在警告了名为的方法,它是或揭示实现具有不同签名的错误接口的类型,这些类型与错误包的预期相同的错误接口。错误。{如,unwrap}函数期望实现这样的方法是(错误)bool,分别为(接口{})bool或unwrap()错误。函数错误。{如,unwrap}将忽略具有相同名称但不同签名的方法。例如:

键入myError struct {提示字符串} func(m myError)错误()字符串{...} // myError实现错误.Func(MyError)是(target接口{})bool {...} //目标是界面{而不是Error.func foo()bool {x,y:= myError {&#34; a&#34;},myerror {&#34; b&#34;返回错误.is(x,y)//返回false作为x!= y和myError没有`是(错误)bool`功能。}

封面工具现在使用来自golang.org/x/tools/cover的优化解析器,当解析大覆盖配置文件时可能明显更快。

Go 1.17实现了一种通过寄存器而不是堆栈传递函数参数和结果的新方法。在64位X86架构(Linux / AMD64,Darwin / AMD64,Windows / AMD64端口)上为Linux,MacOS和Windows启用了此工作。对于代表性的GO包和程序,基准测试显示了大约5%的性能提高,并且二元尺寸的典型降低约为2%。

此更改不会影响任何安全GO代码的功能。它可以影响兼容性指南之外的代码,影响最小。为了保持与现有装配函数的兼容性,有时会使用适配器功能在新的寄存器的调用约定和基于堆栈的呼叫约定(也称为ABI包装)之间进行转换。除了用于进入其地址的装配功能外,这对用户来说主要是不可见的。使用reflect.valueof(fn).pointer()(或类似方法,如通过不安全.pointer),以获取装配函数的地址现在将返回abi包装器的地址。除了专用汇编代码外,这主要是无害的(例如访问线程本地存储或需要特殊的堆栈对齐)。现在将通过Func值间接调用的装配函数通过ABI包装器进行,这可能会导致非常小的性能开销。此外,从程序集中调用Go函数现在可以通过ABI包装,具有非常小的性能开销。

从运行时的堆栈迹线的格式(在发生未捕获的恐慌时打印或调用runtime.stack时)。以前,函数参数基于内存布局打印为十六进制单词。现在,源代码中的每个参数都是单独打印的,用逗号分隔。 Crace括号分隔串字键入(结构,阵列,字符串,切片,interface和复杂)参数。一种警告是,只有在寄存器中且不存储到存储器的参数的值可能是不准确的。结果(通常是不准确的)不再打印。

现在可以内向包含闭包的功能。这种变化的一个效果是具有封闭件的功能实际上可以为函数内衬的每个地方产生不同的闭合功能。因此,这种变化可以揭示通过指针值(错误地)进行比较的错误(错误地)。 go函数是根据定义不可比较的。

运行时/ CGO软件包现在提供了一个新的工具,允许将任何GO值转换为可用于在C之间传递值的安全表示,并安全地转到。有关更多信息,请参阅运行时/ cgo.handle。

与始终一样,与兼容兼容性的Go 1承诺进行了各种次要的更改和更新。

新方法file.openraw,writer.createraw,writer.copy为性能是主要问题的情况提供支持。

Writer.Writerune方法现在为负符号值写入替换字符U + FFFD,因为它为其他无效符号。

Buffer.Writerune方法现在为负符号值写入替换字符u + fffd,因为它为其他无效符号。

保证NewReader函数返回新类型阅读器的值,并保证类似NewWriter以返回新类型编写器的值。这些新类型都实现了允许重用读取器或写入器的重置方法(Reader.Reset,Writer.Reset)。

Crypto / ED25519包已被重写,所有操作现在大约是AMD64和ARM64上的两倍。可观察的行为尚未改变。

Curveparams方法现在可用时自动调用更快和更安全的专用实现(P-224,P-256和P-521)。请注意,这是一种最佳方法,应用程序应避免使用通用,而不是恒定时间Curveparams方法,而是使用诸如P256等专用曲线实现。

已经使用Fiat-Crypto项目生成的代码重写P521曲线实现,该项目基于算术运算的正式验证模型。它现在是恒定的时间,在AMD64和ARM64上快三倍。可观察的行为尚未改变。

Crypto / Rand包现在使用MacoS上的Getentropy Syscall和Solaris,Illumos和DragonflyBSD上的Getrandom Syscall。

New Conn.HandShakeContext方法允许用户控制取消In-progrest TLS握手。通过新的ClientHelloInfo.context和CertificateRequestinfo.context方法可以从各种回调访问提供的上下文。握手完成后取消上下文没有效果。

当设置CONFIG.NEXTPROTOS时,服务器现在强制执行配置协议和客户端通告的协议之间存在重叠,如果有的话。如果没有重叠,则根据RFC 7301的要求,使用No_Application_Protocol警报关闭连接。

Critepto / TLS包现在完全处理密码套件订购。目前,考虑到本地和对等的硬件,根据其安全性,性能和硬件支持来排序密码套件。 CONFIG.CIPHERSUITES字段的顺序现已忽略,以及CONFIG.PREFERSERVERCIPHERSUITES字段。请注意,CONFIG.CIPHERSUITES仍然允许应用程序选择TLS 1.0-1.2的CIPHIAT SUIDES启用。

由于基本块大小相关的弱点,3DES密码套件已被移​​动到Inecureciphersuites。由于上面的密码套件订购更改,它们仍然默认实现,但仅作为最后的手段。

CreateCertificate现在如果提供的私钥并不匹配父钥匙,则返回错误,如果有的话,则匹配父母&#39;结果证书未能验证。

Parsecertificate已被重写,现在消耗较少的资源〜70%。除了错误消息外,可观察行为尚未改变。

在BSD系统上,现在搜索/ etc / ssl / certs以获得可信根。这为FreeBSD 12.2+中的新系统可信证书商店添加了支持。

如果此字段中的类型实现IO.closer接口,则DB.Close方法现在关闭连接器字段。

新的nullint16和nullbyte structs表示可能为null的INT16和字节值。这些可以用作扫描方法的目的地,类似于unullstring。

Binary.Uvarint将在10个字节后停止读取以避免浪费的计算。如果需要超过10个字节,则返回的字节计数为-11。在读取错误编码的Varints时,之前的Go版本可能会返回更大的负计数。

新reader.fieldPOS方法返回与读取最近返回最近返回的记录中给定字段的开头的行和列。

新的context.tooltags字段包含适合当前Go Toolchain配置的构建标记。

源和节点函数现在同步// go:使用// +构建行构建行。如果文件只有// +构建行,则它们将被移动到文件中的相应位置,并匹配// go:将添加构建线。否则,// +构建线将基于任何现有// go覆盖:构建行。有关更多信息,请参阅https://golang.org/design/draft-gobuild。

数学包现在定义了三个常量:maxuint,maxint和minint。对于32位系统,它们的值分别为2 ^ 32-1,2 ^ 31 - 1和-2 ^ 31。对于64位系统,它们的值分别为2 ^ 64-1,2 ^ 63-1和-2 ^ 63。

在UNIX系统上,现在可以从本地系统读取MIME类型的表格&#39; S共享MIME-INFO数据库。

新方法IP.isprivate报告地址是根据RFC 1918的私有IPv4地址,或根据RFC 4193的本地IPv6地址。

Go DNS解析器现在仅在解析IPv4-only或IPv6网络的地址时发送一个DNS查询,而不是查询两个地址系列。

PARSEIP和PARSecidr函数现在拒绝包含带有前导零的十进制组件的IPv4地址。这些组件始终被解释为十进制,但有些操作系统将它们视为八进制。如果使用GO应用程序用于验证其原始表单使用的IP地址,则此错位可能会导致安全问题,然后使用其原始表单使用的非Go应用程序,该应用程序将其解释为八进制的组件。通常,建议在验证后始终重新编码值,这避免了这类解析器错位问题。

NET / HTTP软件包现在在客户端或服务器中执行TLS握手时使用新的(* tls.conn).handshakecontext。

将服务器ReadTimeout或WriteTimeout字段设置为负值,现在没有超时而不是立即超时。

OrkeTereCorder.WriteHiteHerder&gt;现在,当提供的代码不是有效的三位HTTP状态代码时,恐慌。这符合responswriter&gt的行为。网络/ HTTP包中的实现。

文件.WriteString方法已被优化,以不再制作输入字符串的副本。

new structfield.isexported和方法.Xported方法报告是否导出了结构字段或类型方法。它们提供了更可读的替代方案来检查PKGPath是否为空。

新的VisibleFields函数以STRUCT类型返回所有​​可见字段,包括匿名结构成员内的字段。

Strconv封装现在使用ULF ADAMS&#39; sRyū算法来格式化浮点数。 该算法在大多数输入上提高性能,并且在最坏情况的输入上更快地超过99%。 新QuoteDPrefix函数在输入开始时返回引用的字符串(如uTuquate)。 Builder.Writerune方法现在为负符号值写入替换字符U + FFFD,因为它为其他无效符号。 GetQueuedCompletionStatus和PostQueuedCompletionStatus函数现在已被弃用。 这些函数具有不正确的签名,并在golang.org/sys/windows包中取代等效项。 在UNIX的系统上,现在使用阻塞的信号设置子进程的进程组。 这避免了当父级在Backgro时向孩子发送Sigttou ......