Tim Wang Tech Blog

Go 1.18 版本新特性概览

本文由 www.makeuseof.com的中文翻译版本,内容有删减。关于 工作区,泛型和模糊测试更详细的说明,请参考 Go 1.18 的那些事 —— 工作区、模糊测试、泛型

自 2009 年首次发布以来,Go 编程语言已经进步了很多。Go 1.18 是一个备受期待的版本,因为它支持泛型和许多其他重要更新。

Go 于 2022 年 3 月发布了 1.18 版。以下是最重大变化的简要介绍。

对泛型的支持 (Support for Generics)


泛型编程允许您编写在编写函数时,可以用更灵活的类型来定义输入和返回值。

在支持泛型之前,您需要显式声明参数类型和返回类型。 最简单的泛型形式允许您指定无类型参数:

func PrintAnything[T any](thing T) {
    fmt.Println(thing)
}

但是泛型其实功能更加强大,你可以声明任何类型的参数。例如,您可以使用 constraints 包来编写一个函数,该函数可以操作任何可以排序的值。包括 int、float 和 string等。这里是一个示例:

import "golang.org/x/exp/constraints"

 func Max[T constraints.Ordered](input []T) (max T) {
    for _, v := range input {
        if v > max {
            max = v
        }
    }

     return max
}

请注意这个函数使用了泛型和constraints.Ordered 来声明其参数和返回类型。这个函数可以接受任何可以排序的值,例如 int、float 和 string。

泛型可以给代码添加灵活性和可扩展性。泛型提案和变更是向后兼容的。

模糊测试(Fuzz Testing)


模糊测试是一种 软件测试技术,它用于验证一个程序的错误、不可预期或不可预测的数据。

testing 包在 1.18 中引入了模糊测试,因此要定义模糊测试,您必须从标准库中导入它:

import "testing"

在导入 testing 包后,您可以将一个 *testing.F 类型的标识符传递给测试函数。

func testFunc(f *testing.F) {
    
}

模糊测试会自动生成测试代码的输入参数。 模糊测试的结果是不可预测的,因为输入不是用户定义的。 模糊测试应该帮助您写更好的代码测试,并捕获您没有知道存在的 bug。

工作区的支持 (Go Workspace Support)


工作区是一个保存相似的代码的目录,它们组成一个项目或者一个大的单元。 工作区可以使您更容易地管理和调试代码,通过将相似的代码组合在一起来更好地管理。

按照惯例,您可以将 Go 项目分成源代码 (src) 和可执行文件 (bin)。 Go 工具链将源代码从前到后编译成可执行文件。 Go 工作区可以使开发者使用 Go 模块来多个工作区。

创建工作区的命令是:

$ go work <command>

可以用 work 搭配以下子参数使用,例如:

  • init → 在指定目录中创建工作区。
  • use → 向 go.work 添加一个新模块,即 go 工作区文件。
  • edit → 编辑 go 工作区文件。
  • sync → 将构建列表中的依赖项同步到工作区模块。

按照开发语言的计划,在项目中使用工作区将提高生产力。

性能提升 (Performance Improvements)


Go 1.18 版在 API 调用约定中支持 ARM64 Apple M1 和 64 位 PowerPC。 这为这些设备的用户带来了超过 10% 的 CPU 性能提升。

在函数中声明但未使用的变量会在编译时记录为错误。

go build 命令,以及其他相关命令,支持 -asan 参数,这将帮助 Go 的开发者将 Go 程序与 C 和 C++ 程序配合使用。

其他更新 (Other Important Updates)


go get 命令不再在模块化模式下安装包,这是从 first got started with Go 以来的一个大的变化。 go install 命令取代 get 来调整工作区间的模块依赖关系。

由于类型检查器现在也处理泛型的检查,导致错误消息可能会与之前的版本不同。

在 1.18 中编译程序所花费的时间可能会更慢。 但这不会影响 Go 编译程序后的执行时间。

你可以在 Go 1.18 的发行说明中找到关于最新更新的详细信息。

扩展阅读