尝试GO GENRICS:插入排序
#go #generics #sortingalgorithms


通过Midjourney生成的Gopher分类对象

GO 1.18于2022年3月发布,并引入了一个新的语言功能: generics 。让我们看看wikipedia definition

通用编程是一种计算机编程的样式,其中算法是按类型 to-be to-be to-be to-be to-be te-be of-be nem>进行实例化的 em>在需要的特定类型时作为参数

我目前正在研究算法和编码访谈练习,我参加了实施Insertion Sort的练习。这似乎是一个尝试仿制药的机会!

插入排序

插入排序是一种简单的排序算法,它通过在数组上迭代(或在我们的情况下切片),比较项目并一次将它们插入一个正确的位置。我认为这个图形示例很好地解释了它的工作方式:


来源:https://en.wikipedia.org/wiki/Insertion_sort

进入整数实施

这是该算法的实现,而无需使用仿制药:

让我们为此添加一个快速的单元测试:

如何重用字符串切片的相同算法?鉴于我们实现了先前的函数,似乎不可能将其重用为字符串,因此我们必须重新实现字符串的功能。这是仿制药可以用场的。

使用仿制药实施

使用仿制药,除了常规函数参数外,我们还可以将类型参数添加到函数。例如:

代码的[任何]部分表示类型参数。在此示例中,我们将任何用作类型约束。任何等同于空接口界面{} ,因此任何类型都应该能够满足此约束。

但是,上面的代码没有编译,我们会收到以下错误:

invalid operation: items[j] < items[j - 1] (type parameter T is not comparable with <)

代码无效,因为项目需要与<:我们的任何约束都过于宽。幸运的是,在GO软件包中定义了一种有用的类型,它可以按照我们的需要:Ordered

type Ordered interface {
    Integer | Float | ~string
}
// Ordered is a constraint that permits any ordered type: 
// any type that supports the operators < <= >= >.
// If future releases of Go add new ordered types, 
// this constraint will be modified to include them.

在GO 1.18中,排序的类型包括整数,浮点和〜字符串,这些类型具有与字符串相同的基础类型,例如类型的颜色字符串。

让我们尝试修改我们的通用插入排序函数以使用订单的约束:

这实际上是编译的!让我们为整数和字符串添加几个单元测试:

单元测试通过,我们已经完成了GOð

中的第一个通用功能的工作实现

结论

在这篇简短的文章中,我们看到了如何使用GO Generics功能来实现适用于不同类型的排序算法。您如何在自己的代码中使用Go Generic?请在评论部分中分享您的用例。

感谢您的关注,并确保查看github repository的完整代码示例。