Go1.20 那些事:PGO、编译速度、错误处理等新特性,你知道多少?

大家好,我是煎鱼。,最近 Go1.20 在 2 月初已经正式发布,来的挺早的,以往都是拖到月底的,我翻了好几篇,发现最后还是做了不少功能取舍,被迫放了某些新特性(例如:arena 等)的鸽子!,怀疑 Go 团队 2 月份是有什么事要干,或者打算休假?又或是担心裁员影响工作交接?,今天快速温习与我们关联性多些的新特性,看看升不升 1.20。,之前 Go1.18 正式发布了泛型,有欢喜也有忧。这虽然支持了泛型,但是在 Go1.18 起编译速度相对 Go1.17 变慢了,会慢大概 15-18%,降速明显。,图片,泛型特性,把 Go 引以为豪的构建速度都变慢了。怕不是以后构建也可以冲咖啡喝了?,原本说在 Go1.19 修,鸽了。终于,当前版本已经修复了。,如下测试报告:,最新的 Go1.20 基准测试中,当前版本和 Go1.17 的构建速度保持一致。,另外还优化了编译器和垃圾收集器,减少了内存开销,将整体 CPU 性能提高了 2%。,Go1.20 的更新公告中也宣布了一个重大的更新结束通知,涉及 macOS 和 windows 操作系统。,图片,分别如下:,好家伙,看来我需要更新我的操作系统版本了,不然下个版本 Go 都不欢迎我 coding 了。,图片,有需要的同学在下个版本前尽早做好升级。,新版本起,Go 的 $GOROOT/pkg 目录将不再存储标准库的预编译包存档,Go 发行版的将迎来一轮瘦身。,大小对比如下。,Go1.20:,图片,Go1.19:,图片,约比老版本缩减了 1/3,还是比较明显的。,在 Go1.20 起,Go 引入了 Profile-guided optimization (PGO),翻译过来是使用配置文件引导的优化,当前为预览版本。,PGO 是一门编译器优化技术,能够在不改业务代码的情况下,给你的应用程序带来一定的性能提升。在 Go PGO 中将会依托 runtime/pprof 所生成的 profile 来完成。,图片,结果上可以使得 Go tool(工具链)能根据运行时信息执行特定于应用程序和工作负载的优化。说明了就是想提高性能,不需要改业务代码。,具体可以详见:《PGO 是啥,咋就让 Go 更快更猛了?》,在原有 Go1.13 的 errors API 上进行新增和修改,核心是支持一个错误可以封装多个错误的特性。,新特性例子:,输出结果:,具体可以详见:《Go1.20 继续小修小补 errors 库。。。》,Go 团队通过分析、搜索发现 reflect.SliceHeader 和 reflect.StringHeader:,在业内经常被滥用,使用不方便,很容易出现隐性问题。例如:Data 字段类型是 uintptr 不是 unsafe.Pointer。设什么都可以,灵活度过于高,非常容易搞出问题。,在 Go1.20 起,在 unsafe 标准库新增了 3 个函数来替代前面这两个类型的使用。希望能够进一步标准化,并提供额外的类型安全。,图片,如下函数签名:,新版本的用法变成:,以往常用的 reflect.SliceHeader 和 reflect.StringHeader 将会被标注为被废弃。,具体可以详见:《别乱用了,用新的。Go SliceHeader 和 StringHeader 将会被废弃!》,有很多 Go 同学反馈老要记 2006-01-02 15:04:05,发现这个日期时间点,使用的次数非常高频:,使用频率的数据有理有据。,Go1.20 加了以下常量,便于直接引用:,再者就是新增了时间比较的方法。,在现在的标准库中,有 3 个方法来比较 time.Time 对象,分别是:Before()、Equal() 和 After(),作用上类似 <、== 和 >。但缺少 <= 和 >= 的等价物。,Go1.20 将会支持 Time.Compare,以此来达到类似的效果。作用是将 Time 对象 t 和 u 两者进行比较。,该方法返回如下几种结果:,具体可以详见:《Go1.20 中两个关于 Time 的更新,终于不用背 2006-01-02 15:04:05 了!》,以前可以做匿名接口循环导入的骚操作。如下代码:,这段代码,声明了接口类型 I,然后又包含了 m(),又包含接口 I。这会是一个 “永动机”,永远都不会停止。在开源的 GitHub 中,也真实存在着。,Go1.20 起,编译器将会默认拒绝匿名接口循环导入。如果没有用户反馈受到了重大的影响或问题,将会计划在 Go1.22 中正式的禁用和移除该项功能的支持。,具体可以详见:《Go1.20 将禁止匿名接口循环导入!》,Go1.20 将会在没有 C 工具链的系统上默认禁用 CGO。这理论上是一个不兼容性设置,如果大家有需要,可以提前设置好 CGO_ENABLED 环境变量,以避免导致部分应用程序出问题。,Go1.20 起支持将切片转换成数组。,如下代码:,当然,前提是切片和数字的长度和类型都要对的上。否则会出现如下报错:,在本次 Go1.20 的更新中,比较有意思的是 PGO 的预览版本,大家有机会可以体验下不改代码就提高应用性能的快感。而相关的更新有的是在偿还技术债务。例如:编译加速等。,原本关注度很高的 arean,之前在《打脸了兄弟们,Go1.20 arena 来了!》中我分享过。在 Go 团队在具体实现和分析后,发现现有的 API 存在严重的问题,暂时回滚迭代代码了,因此放了鸽子。这块我计划后面再单独分享。,尤其需要注意的,Go1.21 起将不再支持 macOS、windows 部分版本。可能一些公司的机器,甚至自己的要提前升级了。

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/19885.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34