8千字详解Go1.20稳定版(一)

简介: 8千字详解Go1.20稳定版(一)

Go官方正式发布了Go1.20稳定版

image.png

该版本依然保持 Go1 兼容性,可以升级到 Go1.20,而不需要做任何代码改动。

可以使用你任何喜欢的方式升级:

比如:go install golang.org/dl/go1.20@latest

具体的可以参考官网教程:go.dev/doc/go1.20

或者关注我:

Go 1.20 简介

最新的 Go 版本 1.20 在Go 1.19 发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。

一如既往,该版本保持了 Go 1的兼容性承诺。我们期望几乎所有的 Go 程序都能像以前一样继续编译和运行。

内容很长,建议先收藏,再转发给gopher小伙伴们,慢慢看。

语言的变化

Go 1.20 包括对语言的四个更改。

Go 1.17 添加了从切片到数组指针的转换。Go 1.20 扩展了它以允许从切片到数组的转换:给定一个切片x,[4]byte(x)现在可以写成*(*[4]byte)(x).

unsafe定义了三个新函数SliceDataStringStringData。与 Go 1.17 一起Slice,这些函数现在提供了构建和解构切片和字符串值的完整能力,而不依赖于它们的确切表示。

该规范现在定义结构值一次比较一个字段,按照它们在结构类型定义中出现的顺序考虑字段,并在第一个不匹配时停止。之前可以阅读规范,就好像所有字段都需要比较第一个不匹配之外的字段。类似地,该规范现在定义数组值按递增索引顺序一次比较一个元素。在这两种情况下,差异会影响某些比较是否必须恐慌。现有程序没有改变:新的规范措辞描述了实现一直所做的事情。

可比较的类型(例如普通接口)现在可以满足comparable约束,即使类型参数不是严格可比较的(比较可能会在运行时崩溃)。这使得实例化受约束的类型参数comparable (例如,用户定义的通用映射键的类型参数)与非严格可比较的类型参数(例如接口类型或包含接口类型的复合类型)成为可能。

端口

Windows

Go 1.20 是将在 Windows 7、8、Server 2008 和 Server 2012 的任何版本上运行的最后一个版本。Go 1.21 将至少需要 Windows 10 或 Server 2016。

Darwin and iOS

Go 1.20 是将在 macOS 10.13 High Sierra 或 10.14 Mojave 上运行的最后一个版本。Go 1.21 将需要 macOS 10.15 Catalina 或更高版本。

FreeBSD/RISC-V

GOOS=freebsdGo 1.20 在 RISC-V ( , GOARCH=riscv64) 上添加了对 FreeBSD 的实验性支持。

工具

Go command

该目录$GOROOT/pkg不再存储标准库的预编译包存档: goinstall不再写入它们,go构建不再检查它们,Go 发行版不再运送它们。相反,标准库中的包是根据需要构建的,并缓存在构建缓存中,就像外部的包一样GOROOT。此更改减少了 Go 发行版的大小,还避免了使用 cgo 的包的 C 工具链倾斜。

实施gotest-json 已得到改进,使其更加健壮。运行的程序gotest-json 不需要任何更新。直接调用的程序现在应该使用 (例如, 或)而不是普通的来gotooltest2json 运行测试二进制文件。 -v=test2json``gotest-v=test2json``./pkg.test-test.v=test2json``-v

一个相关的变化是 在每个测试程序开始执行时gotest-json 添加了一个Action设置为的事件。start当使用命令运行多个测试时go,这些启动事件保证以与命令行中指定的包相同的顺序发出。

go命令现在定义了体系结构功能构建标签,例如amd64.v2,以允许根据特定体系结构功能的存在或不存在来选择包实现文件。详情请见gohelpbuildconstraint

go子命令现在接受 在执行命令之前 将-C 目录更改为 ,这对于需要在多个不同模块中执行命令的脚本可能很有用。

gobuildandgotest 命令不再接受-i标志,该标志自 Go 1.16 以来已 被弃用

gogenerate命令现在接受 -skip跳过//go:generate匹配的指令

gotest命令现在接受 -skip跳过测试、子测试或匹配的示例

当主模块位于 中GOPATH/src时, goinstall不再为非main包安装库GOPATH/pkg,并且golist不再报告Target 此类包的字段。(在模块模式下,已编译的包仅存储在 构建缓存中 ,但一个错误导致GOPATH安装目标意外地保持有效。)

gobuildgoinstall其他与构建相关的命令现在支持-pgo启用配置文件引导优化的标志,这在下面的 编译器部分中有更详细的描述。该-pgo标志指定配置文件的文件路径。指定-pgo=auto会导致go命令搜索default.pgo在主包目录中命名的文件,如果存在则使用它。此模式目前需要在命令行上指定一个主包,但我们计划在未来的版本中取消此限制。指定-pgo=off关闭配置文件引导的优化。

gobuildgoinstall其他与构建相关的命令现在支持-cover 使用代码覆盖检测构建指定目标的标志。这在下面的封面部分 中有更详细的描述 。

goversion

goversion-m命令现在支持读取更多类型的 Go 二进制文件,最值得注意的是,使用构建的 Windows DLLgobuild-buildmode=c-shared 和没有执行权限的 Linux 二进制文件。

CGO

go命令现在默认在没有 C 工具链的系统上禁用cgo。更具体地说,当CGO_ENABLED环境变量未设置时,环境变量未设置,并且在路径中找不到 CC默认的 C 编译器(通常是clang或),默认为. 与往常一样,您可以通过显式设置来覆盖默认值。 gcc``CGO_ENABLED``0``CGO_ENABLED

默认更改最重要的影响是,当 Go 安装在没有 C 编译器的系统上时,它现在将使用纯 Go 构建标准库中使用 cgo 的包,而不是使用预分发的包存档(有已被删除,如上所述)或尝试使用 cgo 并失败。这使得 Go 在一些最小的容器环境以及 macOS 上工作得更好,在 macOS 上,自 Go 1.16 以来,预分发的包存档还没有用于基于 cgo 的包。

标准库中使用 cgo 的包有netos/userplugin。在 macOS 上,netos/user包已被重写为不使用 cgo:相同的代码现在用于 cgo 和非 cgo 构建以及交叉编译的构建。在 Windows 上,netos/user包从未使用过 cgo。在其他系统上,禁用 cgo 的构建将使用这些包的纯 Go 版本。

在 macOS 上,竞态检测器已被重写为不使用 cgo:启用竞态检测器的程序可以在没有 Xcode 的情况下构建和运行。在 Linux 和其他 Unix 系统以及 Windows 上,需要主机 C 工具链才能使用竞争检测器。

Cover

Go 1.20 支持收集程序(应用程序和集成测试)的代码覆盖率配置文件,而不仅仅是单元测试。

要收集程序的覆盖率数据,请使用gobuild-cover标志构建它,然后运行生成的二进制文件,并将环境变量GOCOVERDIR设置为覆盖率配置文件的输出目录。有关如何开始的更多信息,请参阅 “集成测试覆盖率”登录页面。详细设计和实现见 提案

Vet

改进了嵌套函数对循环变量捕获的检测

该工具现在报告 在子测试函数体内vet调用后对循环变量的引用。T.Parallel()此类引用可能会观察来自不同迭代的变量值(通常会导致测试用例被跳过)或由于不同步的并发访问而导致的无效状态。

该工具还在更多地方检测引用错误。以前它只会考虑循环体的最后一条语句,但现在它递归地检查 if、switch 和 select 语句中的最后一条语句。

针对错误时间格式的新诊断

vet 工具现在报告使用时间格式 2006-02-01 (yyyy-dd-mm)Time.Formattime.Parse。此格式未出现在通用日期标准中,但在尝试使用 ISO 8601 日期格式 (yyyy-mm-dd) 时经常被错误使用。

Runtime

一些垃圾收集器的内部数据结构被重新组织,以提高空间和 CPU 效率。此更改减少了内存开销并将整体 CPU 性能提高了 2%。

在某些情况下,垃圾收集器在 goroutine 协助方面表现得不太不稳定。

Go 1.20 添加了一个runtime/coverage包含 API 的新包,用于在运行时从长时间运行和/或不通过os.Exit().


下一篇:8千字详解Go1.20稳定版(二)+链接地址:https://developer.aliyun.com/article/1393846

相关文章
|
缓存 fastjson Java
FastJson - JSONPath 使用
FastJson - JSONPath 使用
2259 0
|
数据管理 API 调度
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
HarmonyOS Next 是华为新一代操作系统,专注于分布式技术的深度应用与生态融合。本文通过技术特点、应用场景及实战案例,全面解析其核心技术架构与开发流程。重点介绍分布式软总线2.0、数据管理、任务调度等升级特性,并提供基于 ArkTS 的原生开发支持。通过开发跨设备协同音乐播放应用,展示分布式能力的实际应用,涵盖项目配置、主界面设计、分布式服务实现及部署调试步骤。此外,深入分析分布式数据同步原理、任务调度优化及常见问题解决方案,帮助开发者掌握 HarmonyOS Next 的核心技术和实战技巧。
1781 76
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
|
存储 Java 定位技术
SpringBoot整合高德地图完成天气预报功能
本文介绍了如何在SpringBoot项目中整合高德地图API实现天气预报功能。从创建SpringBoot项目、配置依赖和申请高德地图API开始,详细讲解了实体类设计、服务层实现(调用高德地图API获取实时与预报天气数据)、控制器层接口开发以及定时任务的设置。通过示例代码,展示了如何获取并处理天气数据,最终提供实时天气与未来几天天气预报的接口。文章还提供了测试方法及运行步骤,帮助开发者快速上手并扩展功能。
|
存储 自然语言处理 监控
基于DeepSeek的智能客服系统安全与隐私保护:构建可信赖的服务
在前四篇文章中,我们完成了智能客服系统的开发、部署、优化和扩展。本文聚焦于安全与隐私保护,探讨如何构建安全可靠的智能客服系统。内容涵盖数据安全(加密、脱敏、备份)、系统安全(输入验证、身份认证、日志监控)和隐私保护(隐私政策、数据最小化、访问控制),确保用户数据安全及系统稳定运行。通过这些措施,我们可以打造一个可信赖的智能客服系统,为用户提供更好的服务体验。
|
数据可视化 搜索推荐 数据管理
数字化教育系统管理平台:为教务部门量身定制的可视化大屏
在教育行业数字化转型背景下,教务部门面临管理效率低下、数据分散、决策支持不足等挑战。为此,我们推出数字化教育系统可视化大屏,整合招生和学务数据,提供直观的实时分析与可视化展示,助力高效管理和科学决策。平台支持红色(招生)和绿色(学务)主题,涵盖高校数据管理、信息一览、定制化地图展示等应用场景,显著提升数据处理效率和用户体验。
|
数据采集 测试技术 数据安全/隐私保护
Playwright测试中避免使用no-wait-for-timeout的原因
在Web应用自动化测试中,Playwright作为首选框架,其稳定性至关重要。不当使用`no-wait-for-timeout`会导致测试结果不稳定、不符合真实用户体验且难以调试。推荐采用显式等待策略和合理设置超时时间,结合代理IP技术提高测试成功率和数据多样性。示例代码展示了如何在Playwright中配置代理IP进行数据抓取及分类统计。遵循这些最佳实践可确保测试既可靠又贴近实际用户场景。
969 4
Playwright测试中避免使用no-wait-for-timeout的原因
|
运维 监控 安全
WAN 革命:SD-WAN 与传统 WAN 对比
【7月更文挑战第13天】
1612 1
WAN 革命:SD-WAN 与传统 WAN 对比
|
JSON NoSQL Redis
Redis 作为向量数据库快速入门指南
Redis 作为向量数据库快速入门指南
2571 1
|
安全 Linux Shell
Linux系统之间实现免密码登录(SSH无密码登录
【8月更文挑战第21天】要在Linux系统间实现SSH免密码登录,需先在源机器生成SSH密钥对,然后将公钥复制到目标机器的`.ssh/authorized_keys`文件中。可通过`ssh-keygen`命令生成密钥,并使用`ssh-copy-id`命令传输公钥。最后测试SSH连接,确保能无密码登录。若目标机器缺少相关目录或文件,需手动创建并设置适当权限。完成这些步骤后,即可实现安全便捷的免密码登录。
1299 0
|
Windows
Windows 使用windump进行循环抓包
Windows 使用windump进行循环抓包
9871 0