排序是新泛型功能的一个非常自然的用例。
在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] <p class="indent">[a b z] <p class="indent">[0 1 2 3 6]
排序是新泛型功能的一个非常自然的用例。它使代码简洁,几乎没有引入任何复杂性。