庆祝 Go 开源发布十四周年!

简介: 庆祝 Go 开源发布十四周年!

今年二月我们发布了 Go 1.20 版本,八月发布了 Go 1.21 版本,这两个版本更加注重实现的改进,而不是新增语言功能。


其中一个重要的新功能是 Profile-guided optimization (PGO),在 Go 1.20 中进行了预览,并在 Go 1.21 中正式发布。PGO 允许 Go 编译器读取程序的性能剖析数据,从而更好地优化频繁执行的部分。在 Go 1.21 中,启用 PGO 可以使工作负载的 CPU 使用率提高 2% 到 7%。详细信息请参阅《Go 1.21 中的 Profile-guided optimization》和《Profile-guided optimization 用户指南》。


自从 Go 1.2 版本以来,Go 提供了对 go test 的代码覆盖率分析支持。Go 1.20 版本增加了在由 go build 构建的二进制文件中收集代码覆盖率的支持,这使得我们可以在更大的集成测试中进行代码覆盖率分析。详细信息请参阅《Go 集成测试的代码覆盖率》。


自从《Go 1 和 Go 程序的未来》以来,兼容性一直是 Go 的重要特性。Go 1.21 版本通过扩展 GODEBUG 的用法约定,进一步改善了兼容性,以便在必须允许更改(如重要的错误修复)但可能破坏现有程序的情况下进行更改。详细信息请参阅博文《向后兼容性 Go 1.21 和 Go 2》和文档《Go 向后兼容性和 GODEBUG》。


Go 1.21 版本还引入了内置工具链管理支持,使你可以像更改其他依赖项的版本一样轻松更改特定模块中使用的 Go 工具链的版本。详细信息请参阅博文《Go 1.21 中的向前兼容性和工具链管理》和文档《Go 工具链》。


另一个重要的工具改进是将磁盘索引集成到 gopls(Go LSP 服务器)中。这样一来,gopls 在典型的使用场景中的启动延迟和内存使用率都可以减少 3-5 倍。《为不断增长的 Go 生态系统优化 gopls》解释了技术细节。你可以通过运行以下命令来确保你正在运行最新的 gopls:


go install golang.org/x/tools/gopls@latest


Go 1.21 版本引入了新的 cmp、maps 和 slices 包,这是 Go 的第一个通用标准库。此外,还扩展了可比较类型的集合。详细信息请参阅博文《你的所有可比较类型》。


总体而言,我们继续改进泛型并撰写演讲和博文,以解释重要细节。今年两篇值得注意的博文是《拆解类型参数》和《关于类型推断,你一直想知道的一切——以及更多》。


Go 1.21 版本中的另一个重要新功能是 log/slog 包,它为标准库添加了官方的结构化日志记录 API。详细信息请参阅《使用 slog 进行结构化日志记录》。


对于 WebAssembly(Wasm)端口,Go 1.21 版本支持在 WebAssembly System Interface (WASI) preview 1 上运行。WASI preview 1 是一个新的 Wasm “操作系统”接口,被大多数服务器端 Wasm 环境支持。详细信息请参阅《Go 中的 WASI 支持》。


在安全方面,我们继续努力确保 Go 在帮助开发人员了解其依赖关系和漏洞方面处于领先地位,Govulncheck 1.0 在七月份发布。如果你使用 VS Code,你可以使用 Go 扩展直接在编辑器中运行 govulncheck:请参阅本教程开始使用。如果你使用 GitHub,你可以在 CI/CD 中使用 govulncheck 的 GitHub Action 运行。有关检查依赖项的漏洞问题的更多信息,请参阅今年的 Google I/O 演讲《使用 Go 和 Google 构建更安全的应用程序》。


另一个重要的安全里程碑是 Go 1.21 的高度可复现的工具链构建。详细信息请参阅《完全可复现、经过验证的 Go 工具链》。其中演示了在 Mac 上无需使用任何 Linux 工具,实现在 Ubuntu Linux 上复现 Go 工具链的过程。


这是一个忙碌的一年!


在 Go 迈入第十五个年头时,我们将继续努力使 Go 成为最适合规模化软件工程的环境。我们特别期待的一项改变是重新定义 for loop := 语义,以消除意外的别名错误。详细信息请参阅博文《修复 Go 1.22 中的 for 循环》。


感谢你们的支持! Go 项目一直远远超出了 Google Go 团队的范畴。感谢所有贡献者和 Go 社区的每一个人,正是因为你们,Go 才有了今天的成就。祝愿大家在未来的一年里一切顺利。


参考资料


Go 1.21 中的 Profile-guided optimization:https://go.dev/blog/pgo


Profile-guided optimization 用户指南:https://go.dev/doc/pgo


Go 集成测试的代码覆盖率:https://go.dev/blog/integration-test-coverage


向后兼容性 Go 1.21 和 Go 2:https://go.dev/blog/compat


Go 向后兼容性和 GODEBUG:https://go.dev/doc/godebug


Go 1.21 中的向前兼容性和工具链管理:https://go.dev/blog/toolchain


Go 工具链:https://go.dev/doc/toolchain


为不断增长的 Go 生态系统优化 gopls:https://go.dev/blog/gopls-scalability


你的所有可比较类型:https://go.dev/blog/comparable


拆解类型参数:https://go.dev/blog/deconstructing-type-parameters


关于类型推断,你一直想知道的一切——以及更多:https://go.dev/blog/type-inference


使用 slog 进行结构化日志记录:https://go.dev/blog/slog

Go 中的 WASI 支持:https://go.dev/blog/wasi


使用 Go 和 Google 构建更安全的应用程序:https://www.youtube.com/watch?v=HSt6FhsPT8c&ab_channel=TheGoProgrammingLanguage


完全可复现、经过验证的 Go 工具链:https://go.dev/blog/rebuild


修复 Go 1.22 中的 for 循环:https://go.dev/blog/loopvar-preview

相关文章
|
18天前
|
NoSQL 测试技术 Go
自动化测试在 Go 开源库中的应用与实践
本文介绍了 Go 语言的自动化测试及其在 `go mongox` 库中的实践。Go 语言通过 `testing` 库和 `go test` 命令提供了简洁高效的测试框架,支持单元测试、集成测试和基准测试。`go mongox` 库通过单元测试和集成测试确保与 MongoDB 交互的正确性和稳定性,使用 Docker Compose 快速搭建测试环境。文章还探讨了表驱动测试、覆盖率检查和 Mock 工具的使用,强调了自动化测试在开源库中的重要性。
|
5月前
|
SQL 关系型数据库 测试技术
技术经验分享:Go开源项目
技术经验分享:Go开源项目
42 0
|
3月前
|
SQL 关系型数据库 MySQL
「Go开源」goose:深入学习数据库版本管理工具
「Go开源」goose:深入学习数据库版本管理工具
「Go开源」goose:深入学习数据库版本管理工具
|
3月前
|
缓存 JavaScript 前端开发
为开源项目 go-gin-api 增加 WebSocket 模块
为开源项目 go-gin-api 增加 WebSocket 模块
46 2
|
4月前
|
前端开发 JavaScript Go
|
3月前
|
消息中间件 关系型数据库 MySQL
为开源项目 go-gin-api 增加后台任务模块
为开源项目 go-gin-api 增加后台任务模块
31 0
|
4月前
|
Oracle 关系型数据库 MySQL
|
5月前
|
关系型数据库 Go 开发工具
|
6月前
|
Kubernetes Go 开发者
GO编程语言:简洁、高效、强大的开源编程语言
GO语言,又称Golang,是由Google公司开发的一种静态类型、编译型的编程语言。其设计理念是提供一种直观、简洁、可靠的解决方案
86 2
|
6月前
|
JSON 缓存 物联网
推荐一款go语言的开源物联网框架-opengw
推荐一款go语言的开源物联网框架-opengw
155 4
下一篇
无影云桌面