热门标签 | 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 尽可能稳定。与往常一样,如果您发现任何问题,请 提出问题

我们希望您喜欢新版本!

 


推荐阅读
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 本文介绍了Java调用Windows下某些程序的方法,包括调用可执行程序和批处理命令。针对Java不支持直接调用批处理文件的问题,提供了一种将批处理文件转换为可执行文件的解决方案。介绍了使用Quick Batch File Compiler将批处理脚本编译为EXE文件,并通过Java调用可执行文件的方法。详细介绍了编译和反编译的步骤,以及调用方法的示例代码。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
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社区 版权所有