热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang1.17于2021年8月16日正式发布

马特皮尔林和亚历克斯拉科齐2021年8月16日今天,Go团队很高兴发布Go1.17,您可以通过访问下载页面获得。编译器改进此版本为编译器带来了额外

马特·皮尔林和亚历克斯·拉科齐

2021 年 8 月 16 日

今天,Go 团队很高兴发布 Go 1.17,您可以通过访问 下载页面获得


编译器改进

此版本为编译器带来了额外的改进,即传递函数参数和结果的 新方法。这一变化表明,Go 程序的性能提高了约 5%,amd64 平台的二进制文件大小减少了约 2%。未来版本将支持更多平台。

Go 1.17 实现了一种使用寄存器而不是堆栈传递函数参数和结果的新方法。一组具有代表性的 Go 包和程序的基准测试显示,性能提高了约 5%,二进制大小通常减少了约 2%。这是目前在Linux,MacOS和Windows中启用的64位x86架构(的linux/amd64, darwin/amd64和windows/amd64端口)。

此更改不会影响任何安全 Go 代码的功能,并且不会影响大多数汇编代码。它可能会影响unsafe.Pointer 访问函数参数时违反规则的代码,或者取决于涉及比较函数代码指针的未记录行为。为了保持与现有汇编函数的兼容性,编译器生成了在新的基于寄存器的调用约定和以前的基于堆栈的调用约定之间进行转换的适配器函数。这些适配器通常对用户不可见,除了在汇编代码中获取 Go 函数的地址或在 Go 代码中使用reflect.ValueOf(fn).Pointer() 或获取汇编函数的地址之外unsafe.Pointer现在将返回适配器的地址。依赖于这些代码指针值的代码可能不再按预期运行。在两种情况下,适配器也可能导致非常小的性能开销:通过func值从 Go 间接调用汇编函数,以及从汇编调用 Go 函数。

运行时堆栈跟踪的格式(在发生未捕获的恐慌时或runtime.Stack调用时打印)得到改进。以前,函数参数根据内存布局打印为十六进制字。现在源代码中的每个参数都单独打印,用逗号分隔。聚合类型(结构、数组、字符串、切片、接口和复杂)参数由花括号分隔。需要注意的是,仅存在于寄存器中而不存储到内存中的参数的值可能不准确。不再打印函数返回值(通常不准确)。

现在可以内联包含闭包的函数。此更改的一个影响是,带有闭包的函数可能会为函数内联的每个位置生成一个不同的闭包代码指针。Go 函数值不能直接比较,但此更改可能会揭示使用reflect 或unsafe.Pointer绕过此语言限制并通过代码指针比较函数的代码中的错误。


windows ARM

Go 1.17 还增加了 对 Windows 上 64 位 ARM 架构的支持,让 gophers 在更多设备上本地运行 Go。


go module

我们还在此版本中引入了修剪后的模块图。go 1.17在其go.mod文件中指定或更高的模块将使其模块图仅包含其他 Go 1.17 模块的直接依赖项,而不是它们的完整传递依赖项。这应该有助于避免go.mod为其他不相关的依赖项下载或读取文件的需要——节省日常开发的时间。

Go 1.17对语言进行了三个小改动。前两个是unsafe包中的新函数,使程序更容易遵守unsafe.Pointer规则:unsafe.Add允许 更安全的指针算术,同时unsafe.Slice允许 更安全地将指针转换为切片。第三个变化是语言类型转换规则的扩展,允许从切片到数组指针的转换 ,前提是切片在运行时至少与数组一样大。

最后还有很多其他改进和错误修复,包括对crypto/x509 的验证改进,以及对URL 查询解析的更改 。有关更改的完整列表以及有关上述改进的更多信息,请参阅 完整的发行说明

感谢所有通过编写代码、提交错误、分享反馈以及测试 Beta 版和候选发布版而为此版本做出贡献的人。您的努力有助于确保 Go 1.17 尽可能稳定。与往常一样,如果您发现任何问题,请 提出问题

我们希望您喜欢新版本!

 


推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 本文介绍如何在QT框架中使用QWebSocket和QTcpSocket实现SSL加密通信,涵盖单向认证设置。单向认证常见于Web通信场景,其中客户端验证服务端证书,而服务端不验证客户端证书。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 本文介绍如何在Linux服务器之间使用SCP命令进行文件传输。SCP(Secure Copy Protocol)是一种基于SSH的安全文件传输协议,支持从远程机器复制文件到本地服务器或反之。示例包括从192.168.45.147复制tomcat目录到本地/home路径。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有