对于排序,go语言的sort包里提供有丰富的接口,内置有3个类型的排序接口,sort.Float64s,sort.Ints,sort.Strings分别对应的浮点数,整数,字符串切片的排序。还有一个Slice函数,定义如下:func Slice(slice interface{}, less func(i, j int) bool),只需传入一个要排序的切片,一个回调函数即可。
使用范例如下:
package main
import (
"fmt"
"sort"
)
type Student struct {
Id int
Name string
}
//因为[]Student切片不能创建接口,所以要专门定义一个类型StuL,使用结构体指针切片的好处是传递结构体指针,效率更高。
type StuL []*Student
func (s StuL) comp(i, j int) bool {//定义一个排序函数
if s[i].Id != s[j].Id {//先按Id排序
return s[i].Id < s[j].Id
}
return s[i].Name < s[j].Name//再按Name排序
}
func main() {
// 准备3个切片
fls := []float64{5.23, 11.4, 5.12, 9.35, 3.9}
ints := []int{22, 11, 5, 19, 37}
names := []string{"ssd", "zd", "23z", "ab"}
// sort 包中内建的3个类型排序接口
sort.Float64s(fls)
sort.Ints(ints)
sort.Strings(names)
// range遍历切片
for _, v := range fls {
fmt.Printf("%v\t", v)
}
fmt.Println("")
for _, v := range names {
fmt.Printf("%v\t", v)
}
fmt.Println("")
for _, v := range ints {
fmt.Printf("%v\t", v)
}
fmt.Println("")
//当是结构体类型排序时,需要定义一个切片,创建一个排序回调函数,再使用Slice函数。
stus := StuL{{23, "and"}, {8, "zz"}, {8, "ywe2"}, {8, "bench"}, {11, "ssz"}, {5, "aa"}}
//sort.Slice() 函数只要求传入需要排序的数据,以及一个排序时对元素的回调函数,类型为 func(i,j int)bool
sort.Slice(stus, stus.comp)
for _, v := range stus {
fmt.Printf("%v\t", v)
}
}