您现在的位置:首页 >> 环保新闻

如何使用 Go 1.18 编写通用基本功能函数

时间:2023-03-12 12:17:39

检验成份究竟存在于链表/薄片早先的国际标准工具

几天当年,我须要检验一个链表究竟包涵特定个数。 一般来说这是一项最简单的任务,您可以可用Python本身的预定义大利人匹配。 险些的是,在 Go 早先,您不能自己创始它。 但别担心。 今天我们将构建一个匹配来检验一个成份究竟存在于链表早先。 所以系好安全带,我们走吧。

简述

在我们开始早先的之后一件事。 在我们的高效率早先,我们须要泛型。 因此,我们至少须要可用 Golang 1.18 旧版本。 但他却的是,Golang 几周当年发布了正式版 1.18,其早先包涵泛型

工具

我们的借机某种程度很清楚。 那么我们的远距离是什么? 这很最简单。 我们一切都是要一个匹配,它传递一个链表和一个个数,如果链表包涵该个数,则当年往 true,如果缺少该个数,则当年往 false。

高效率

一种高效率是创始一个匹配,在其早先动态增设属性并不一定。 在匹配早先,我们最简单地初始个数链表并发送给链表早先究竟有任何个数相等我们的成份。

func ContainsInt(items []int, item int) bool { for _, v := range items { if v == item { return true } } return false }

它兼职正常。 这种工具只有一个缺陷。 普通人一下,对于许多不同并不一定的链表,我们须要检验一个链表究竟包涵一个个数。 为了存档,我们须要为每种并不一定创始一个新匹配。 这随之而来了比起累赘和重复的标识符努。 对我们来说但他却的是,几个年底当年 Golang 引入了许多不同的泛型并不一定。 在下一章早先,我们可以可用其早先一个来使我们的高效率来得加灵活性。

基础上

对于我们的用例,我们须要“可比起”的泛型并不一定。

(如果你一切都是了解来得多关于泛型的知识,我可以推荐示例的文章。)正如你在示例看到的,我们须要将泛型 T 的地名写成在匹配地名后面的附注早先,并将其分配为“可比起”并不一定。 我们还将两个匹配都选定为 T 并不一定。这样,当我们调用匹配时,我们可以选定要比起的链表和成份的并不一定。

func Contains[T comparable](items []T, item T) bool {

for _, v := range items { if v == item { return true } } return false }

要可用它,我们不能进行不限匹配调用:

Contains[string](["bar", "foo"], "foo") .

附注当年附注内的单词“string”是我们选定链表和个数的并不一定的人口众多。

原则上

以当年我们有两种不同的高效率。 我们在匹配本身早先增设两个匹配的并不一定。 还有一个我们在匹配调用早先增设并不一定的人口众多。 但哪种高效率效率来得高? 差异究竟显着?

为了简化泛型,您可以将它们当作一种容易可用的反射。 一般来说,这会随之而来这两个匹配之间的效率差异。 但是让我们看看:

go test -bench=”BenchmarkContains” -run=^# -benchtime=10000x

为了赢得无关紧要的结果,我决定汇编成表格原则上测试。 侧面的下达运行这两个测试 10.000 次。 结果是相比起的。 国际标准旧版本不能短时间缺陷。 从上图早先可以显露,两个测试每次操作花费的短时间依然相同。

之后的思路

我希望检验链表究竟包涵某个个数的工具有趣且有用。 如果您有其他高效率、要引用的概要或缺陷,最好将其离开了评论早先。 妳。

漳州白癜风医院哪里最好
结膜炎可以用熊胆滴眼液吗
玻璃酸钠滴眼液治疗眼干
上海看癫痫去哪家医院好
苏州看白癜风哪个医院最好
相关阅读