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 细节请查看 Go 语言官网。