17611538698
webmaster@21cto.com

Go 1.23 新特性

编程语言 0 1033 2024-09-02 08:23:26

图片

Go 1.23 已经发布,所以现在是探索新功能的好时机。官方发布说明有一些枯燥,我们总结了一个列表版本,展示了哪些变化以及新行为是什么。

  1. 新的迭代器语法

  • range-over-func:在 "for-range" 循环中,现在可以使用迭代器函数作为 range 表达式,如 func (func (K) bool)。这支持用户自定义任意序列的迭代器,增强了 Go 语言在处理复杂数据结构时的灵活性和表达力。标准库的 slices 和 maps 包也添加了支持迭代器的新功能。

2. 泛型类型别名预览

  • Go 1.23 包含了对泛型类型别名的预览支持。启用 GOEXPERIMENT=aliastypeparams 可以在包内使用泛型类型别名(跨包使用暂不支持)。这是 Go 语言在类型系统上的重大突破,使得开发者能够创建通用类型,从而减少重复代码并提高代码的复用性。

3. 遥测系统

  • 引入了一个可选的遥测系统,用于收集 Go 工具链的使用情况和错误统计,以帮助理解 Go 工具链的使用情况和效果。通过 go telemetry on 命令可以启用遥测系统,但默认不开启。

4. Go 命令改进

  • go env -changed:显示与默认值不同的环境变量设置,方便开发者追踪和管理环境依赖。

  • go mod tidy -diff:提供预览 go.mod 和 go.sum 文件变更的功能,无需实际修改文件,便于开发者提前评估更改影响。

  • go vet 增强:现在可以报告对于目标 Go 版本来说过新的符号,有助于开发者在向新版本迁移时发现问题并及时解决。

5. 标准库和工具包更新

  • iter 包:支持迭代器相关功能,增强对复杂数据结构的处理能力。

  • structs 包:定义用于修改结构体属性的标记类型,简化结构体操作。

  • unique 包:提供工具用于实现值的 interning(类似于“字符串驻留”或“哈希压缩”),提高内存使用效率。

  • time 包优化:改进了 time.Timer 和 time.Ticker 的实现,提高了时间相关操作的性能和准确性。

  • slices 包新增 Repeat 方法:该方法会返回一个新的切片,函数的作用是将所提供的切片,按给定的次数进行重复。

  • os.DirFS 方法:返回以目录 dir 为根的文件树的文件系统(fs.FS),再结合 os.CopyFS 方法可以实现一次性的递归复制文件和目录。

  • panic 函数改进:在新版本中,panic 函数会用制表符缩进错误信息的第二行和后续行,以区别于第一个 goroutine 的堆栈跟踪。

  • net.http 标准库新增 ParseCookie 和 ParseSetCookie 方法:这两个方法用于从 Cookie 标头字符串中提取 Cookie 结构体,使得处理 Cookie 变得更加方便和直接。

6. 其他改进

  • 编译器优化:通过重叠函数中局部变量的栈帧槽位,减少了栈的使用,并通过 Profile Guided Optimization(PGO)改善了编译时间。

  • 链接器限制:链接器现在不允许使用 //go:linkname 指令引用未标记 //go:linkname 的标准库内部符号,除非这些符号已有较大使用量。

  • 操作系统要求:Go 1.23 开始要求 macOS 11 Big Sur 或更高版本,是最后一个支持 Linux 2.6.32 及更高版本的发行版,Go 1.24 将要求 Linux 3.17 或更高版本。

  • ARM64 和 RISC-V:引入了新的环境变量 GOARM64 和 GORISCV64,用于指定 ARM64 和 RISC-V 目标架构版本。

Go 1.23 的发布标志着 Go 语言在标准化和工具集方面的持续进步,为开发者提供了更加高效、灵活的编程环境。这些新特性和改进不仅提升了 Go 语言本身的竞争力,也为开发者社区的创新提供了更多可能性。

相关参考:

https://pkg.go.dev/math/big


图片

编辑:万能的大雄

评论