在Golang中使用泛型实现slice排序 - gosamples


排序是新泛型功能的一个非常自然的用例。
在Go中对slice进行排序是以前每次有新的slice类型时都要重新编写的事情之一。有时你会为两种不同的类型使用相同的代码。
从Go 1.18开始,由于新的泛型功能,这不再是一个问题了。
你可以编写一个单一的通用排序函数,它适用于任何数值可以被排序的类型。
你可以使用golang.org/x/exp/slices包中的排序函数slices.Sort()和slices.SortFunc()来代替自己编写的函数,该包与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)
}

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

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

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