在 Go 1.16 发布六个月后,Go 1.17 终于发布。主要更新在工具链、运行时和库的实现方面。一如既往,该版本保持了 Go 1 的兼容性承诺,Go 语言官方称:期望几乎所有的Go程序都能像以前一样继续编译和运行。
Go 1.17包括对语言的三个小的增强。
- 从 slice 到数组指针的转换。
[]T
类型的表达式s
现在可以被转换为数组指针类型*[N]T
。如果a
是这种转换的结果,那么在范围内的相应指数指的是相同的基础元素。&a[i] == &s[i]
对于0 <= i < N
。如果len(s)
小于N
,转换就会陷入困境。 unsafe.Add
:unsafe.Add(ptr, len)
向ptr
添加len
,并返回更新的指针unsafe.Pointer(uintptr(ptr)+uintptr(len))
。unsafe.Slice
。对于类型为*T
的表达式ptr
,unsafe.Slice(ptr, len)
返回一个类型为[]T
的片断,其底层数组从ptr
开始,长度和容量为len
。
增加了包unsafe的增强功能,以简化编写符合unsafe.Pointer
的安全规则的代码,但这些规则没有改变。特别是,正确使用unsafe.Pointer
的现有程序仍然有效,而新程序在使用unsafe.Add
或unsafe.Slice
时仍然必须遵循规则。
请注意,从slice到数组指针的新转换是类型转换在运行时可能发生恐慌的第一种情况。假设类型转换永远不会恐慌的分析工具应该被更新以考虑这种可能性。
更多版本细节,请查看官方 Release Notes