Go1.17发布
Contents
go1.17版本在8月16号发布了,新增的功能和变更如下:
1. 编译优化
go1.17将使用栈传递参数和返回值替换为使用寄存器。实现性能提升5%,最终生成的二进制包大小减少2%。
该优化目前支持Linux、macOS、Windows的64位X86架构。官方表示后续会支持更多架构。
2. 跨平台支持
支持windows系统64位ARM架构
3. go module改变
新增了 pruned module graphs 功能,当go.mod文件中指定了go 1.17或者更高版本,且依赖的包同样是go 1.17或者更高版本,go.mod中只保留直接依赖。
4. 新增语言特性
1. 新增unsafe.Add方法,方便指针运算,是Pointer(uintptr(ptr) + uintptr(len)
的简化
func Add(ptr Pointer, len IntegerType) Pointer
2. 新增unsafe.Slice方法,方便将指针转换为slice,是(*[len]ArbitraryType)(unsafe.Pointer(ptr))[:]
的简化
func Slice(ptr *ArbitraryType, len IntegerType) []ArbitraryType
下面代码为它的使用示例:
|
|
运行结果为:
|
|
3. 支持从slice到array转换
Converting a slice to an array pointer yields a pointer to the underlying array of the slice. If the length of the slice is less than the length of the array, a run-time panic occurs.
slice转为array指针将生成一个指向slice底层数组的指针。如果slice的长度小于array的长度,会panic。
|
|
通过例子了解slice转为array的原理:
|
|
运行结果:
|
|
5. 性能提升和bug修复
1. 提升crypto/x509性能
2. 修复URL Query解析bug,在1.17版本前,分号(;)和&一样可以作为参数的分隔符号。1.17版本去掉了分号作为分隔符。
6. 泛型前瞻
go预计会在1.18版本正式发布泛型,在这之前可以通过一些其他方法来体验,例如通过编译go master分支源码,1.17版本中加入-gcflags "-G=3"
,或者使用官方提供的Play ground。下面这个去重的例子就是在play ground上运行的:
|
|
Author 刘玮
LastMod 2022-02-12