对于结构体的切片排序,可以导入sort.Sort(data interface),由于data为interface接口类型,因此就必须实现interface接口中的所有方法。
Interface 接口的三个方法。
案例:实现一个学生的结构体的切片,并按成绩由高到低进行排序。
package main
import (
"fmt"
"sort"
"math/rand"
"time"
)
//声明一个学生的结构体
type Student struct {
Name string
StuNo int
Age int
Score int
}
//声明Student结构体的切片类型
type StuSlice []Student
//实现Interface接口,就是实现接口中的所有方法
func (ss StuSlice) Len() int {
return len(ss)
}
//Less方法就是决定使用什么标准进行排序
//按学生的成绩进行排序
func (ss StuSlice) Less(i,j int) bool {
return ss[i].Score > ss[j].Score
}
func (ss StuSlice) Swap(i,j int) {
// tmp := ss[i]
// ss[i] = ss[j]
// ss[j] = tmp
ss[i],ss[j] = ss[j],ss[i] //与上面的交换方法一致
}
func main() {
var (
students StuSlice
)
stuName := [...]string{"王依","张耳","赵叁","钱思","李武","孙旒","周琦","陈芭","武鸠","刘诗"}
stuAge := [...]int{16,17,15,17,16,17,15,16,16,17}
for i := 0; i < 10; i ++ {
rand.Seed(time.Now().UnixNano())
stus := Student{
Name : stuName[i],
StuNo: i+1 ,
Age : stuAge[i],
Score: (rand.Intn(50) + 50),
}
//将stus append 到students的切片中
students = append(students,stus)
}
//排序前的顺序
fmt.Println("-------排序前--------")
for _,v := range (students) {
fmt.Printf("姓名:%v; 学号:%v; 年龄:%d; 成绩:%v \n",v.Name,v.StuNo,v.Age,v.Score)
}
//调用sort 包中的Sort()的方法
fmt.Println("-------排序后--------")
sort.Sort(students)
//输出按学生成绩排序的结果
for _,v := range (students) {
fmt.Printf("姓名:%v; 学号:%v; 年龄:%d; 成绩:%v \n",v.Name,v.StuNo,v.Age,v.Score)
}
}
输出结果: