🩰 在Go中使用泛型对任何类型的片断进行排序的方法

930 阅读1分钟

在Go中对分片进行排序是以前每次有新的分片类型时都要重新编写的事情之一。有时你会为两种不同的类型使用相同的代码。从Go 1.18开始,由于新的泛型功能,这不再是一个问题了。你可以写一个单一的通用排序函数,对任何数值可以排序的类型都有效。

package main

import (
    "fmt"
    "sort"

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

func sortSlice[T constraints.Ordered](s []T) {
    sort.Slice(s, func(i, j int) bool {
        return s[i] < s[j]
    })
}

func main() {
    floatSlice := []float64{2.3, 1.2, 0.2, 51.2}
    sortSlice(floatSlice)
    fmt.Println(floatSlice)

    stringSlice := []string{"z", "a", "b"}
    sortSlice(stringSlice)
    fmt.Println(stringSlice)

    intSlice := []int{0, 3, 2, 1, 6}
    sortSlice(intSlice)
    fmt.Println(intSlice)
}

与我们之前的教程相比,我们在这里引入的唯一新东西是 constraints.OrderedsortSlice() 函数中的新约束条件。它保证该函数可以对任何类型的值进行排序,支持运算符<,<=,>=,> 。为了证明这一点,请看main() 例子的输出,其中三个不同类型的切片用一个函数进行了排序。

[0.2 1.2 2.3 51.2]
[a b z]
[0 1 2 3 6]

排序是新泛型功能的一个非常自然的用例。它使代码简洁,几乎没有引入任何复杂性。