关于Go1.18你想知道的都在这里
@ 归零 | 星期日,十二月 19 日,2021 年 | 1 分钟阅读 | 更新于 星期日,十二月 19 日,2021 年

原文:https://betterprogramming.pub/golang-1-18-what-you-need-to-know-a5701f7e14ab

在Go 1.18中,有两件大事是你需要知道的。类型参数(在其他语言中称为泛型)和模糊测试,但为什么它们如此重要?

Golang团队正在努力开发Go1.18,该版本将于2022年2月发布,它将是一个大的版本。Go1.18将引入泛型和模糊测试,这有可能彻底改变我们开发和测试Go程序的方式。我们将在下面看一下这两个新特性。

类型参数

类型参数将允许Go程序员用占位符类型名称定义函数和方法。这将允许开发人员编写可以在项目的不同部分重复使用的代码,但仍然可以对他们期望支持的所有数据类型进行通用处理。

让我们来看看一个普通的Go函数(在1.18之前),计算两个数中较小的一个数。

func min(a, b int) int {
	if a < b {
		return a
	}
  
	return b
}

上面这个方法中,我们把两个整数作为参数,min(1,2)和min(2,1)都将返回1。到目前为止还不错,但是当你想得到两个浮点数的较小值时,怎么办呢?我们将不得不写一个新的函数,它需要两个浮点数作为参数,而且我们不能重复使用第一个函数的代码。函数的主体仍然是完全相同的代码。如果我们想得到两个float64数的较小值,我们将不得不再次编写相同的函数,以float64作为参数。

现在让我们来看看Go的泛型。你现在可以用一个任意的占位符类型名称来定义函数,这个名称将作为其他类型的参数。在Go中,泛型是以类型T的形式来写的。

这意味着你可以用任何占位符类型的名字来定义一个函数,这个名字以后会被另一个参数填入。现在我们用新的泛型方法重构之前的例子。

type numeric interface {
	type int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64
}

func min[T numeric](a, b T) T {
	if a < b {
		return a
	}
	return b
}

如上,这段代码有点长。首先,我们定义一个接口,它将所有的数字类型声明为numeric的新类型。这意味着我们可以在泛型中使用float64int。然后,像之前一样,我们定义一个新的min函数。

不同的是,现在这个函数在头部有一个类型参数:min[T numeric]…. 这告诉Go,类型T应该是一个数字类型,所以是我们在接口中声明的任何类型。然后,像以前一样我们声明一个函数,只不过我们用T代替了int。

如果新的函数现在被调用,Go会检查用户提供的类型是否符合接口的要求。如果是的话,它将在整个函数中用该类型替换Tw。因此,如果我们输入一个int类型的数字,我们也会得到一个整数的回报。如果我们输入一个float64,我们将得到一个float64的返回值,以此类推。因此,我们现在有了一个单一的 “全能 “函数,而不是写12个内容完全相同的函数,但对Go中的每个数字类型都有不同的参数类型。

模糊测试

除了泛型之外,Go还将在Go1.18版本中内置模糊测试。模糊测试允许针对大量不同的输入运行测试。例如,我们有一个函数,它接收了两个数字作为参数,并对它们做了一些处理。我们现在想通过单元测试来确保该函数正常工作。

通常我们期望函数处理的每个数字写一个测试。如果我们的输入数据是[0, 100], [200, 100], 和[1234, 4321], 那么我们总共有三个测试。但是,如果输入是我们没有想到的呢?也许是一个负数?所以我们也要对这些进行测试。

函数的原始开发者可能不会想到大数,因为他们认为没有人会在函数中插入一个大数,但也许有人会这样做。所以他们也必须覆盖这些,以避免程序崩溃。对于数字来说,这可能很容易,但是如果测试只在输入[-1337, 1337]时失败怎么办?

开发人员不可能测试所有可能的输入值。这就是模糊测试的作用,模糊测试会给你的函数输入大量的随机值来测试它们。

必须在*_test.go文件中定义一个函数,名称为FuzzXxx,并且应该接受一个*testing.F参数,就像TestXxx函数接受一个*testing.T参数类似,这就是模糊测试的基本语法。

func FuzzParseQuery(f *testing.F) {
    f.Fuzz(func(t *testing.T, n int) {
      err := doSomething(n)
      // check for errors in err here
    })
}

在第二行,有两个参数*testing.T和int。 第一个参数t和正常的单元测试参数一样。后面的参数,你可以在那里使用任何类型,Go会自动用该参数的随机输入来运行测试。

所以如果我们的测试函数输入的是数字类型,Go会用随机数字来运行它。然后你可以像通常那样检查错误,你不必担心测试集的问题。一切都将由模糊测试包来处理。

总结

如果你是一个Go开发人员,即将发布的Go1.18将带来两个重大变化,泛型和模糊测试。

有了泛型,程序员可以创建处理任何类型的函数,而不必为每个数字类型编写12个不同的版本; 模糊测试允许开发人员针对随机值运行单元测试,有助于确保测试中涵盖更多可能的输入。

© 2014 - 2022 Lionel's Blog

Powered by Hugo with theme Dream.