利用go sort.Sort()排序自定义切片

  • [1 sort.Sort()简介](#1 sort.Sort()简介)
  • [2 核心功能](#2 核心功能)
  • [3 调用前提](#3 调用前提)
  • [4 代码示例](#4 代码示例)

1 sort.Sort()简介

Go语言中的sort.Sort函数是标准库提供的通用排序接口

2 核心功能

核心功能支持多种类型进行快速排序

基础类型支持‌:内置Ints、Float64s、Strings等函数直接排序常见切片

自定义排序‌:通过实现接口支持复杂结构体排序(如学生按成绩排序)

稳定排序‌:sort.Stable()保证相等元素的原始顺序

逆序排序‌:sort.Reverse包装器实现降序

今天主要介绍下常见的自定义类型

3 调用前提

首先我们打开vscode. 引入sort包看看这个函数的参数

可以看到我们需要实现对传入sort.Sort()函数实现这三个参数

Len() int

Less(i, j int) bool

Swap(i, j int)

4 代码示例

复制代码
代码演示如下: 
首先我先描述下示例结构.
我的GOPATH:GOPATH=C:\软件\go\bin
目录结构如下
- $GOPATH/maindir/main.go                          #这个是main入口
- $GOTPAH/sortinterface/sortinterface.go           #sortinterface包. 定义结构体,切片相关操作函数
- $GOTPAH/sortinterface/randfun.go                 #sortinterface包, 生成随机数据的函数
go 复制代码
//$GOTPAH/sortinterface/randfun.go  
//生成随机数据的函数,生成随机数据
package sortinterface

import (
	"math/rand"
)

const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

func RandStringBytes(n int) string {
	b := make([]byte, n)
	for i := range b {
		b[i] = letterBytes[rand.Intn(len(letterBytes))]
	}
	return string(b)
}

go 复制代码
//$GOTPAH/sortinterface/sortinterface.go  
//1 此脚本定义了一个person struct. 然后定义了2个切片, 分别以切片中[]person的 person struct结构体中的name和age字段进行排序演示
//2 type ByName []Person
//3 type ByAge []Person
//4 GenerateRandPersons(slicesize int, namesize int) ([]Person, []Person)  此函数参数传入切片大小slicesize ,也就是切片中有多少个Persion结构体,namesize这个参数表示生成的Person结构体中随机生成的name的字符串字节数,6表示生成6位Byte的字符串,这个函数会调用上边的函数随机生成指定位数的字符串作为Person.Name
package sortinterface
import (
	"math/rand"
)
type Person struct {
	Name string
	Age  int
}
type ByName []Person
type ByAge  []Person

func (b ByName) Len() int {
	return len(b)
}
func (b ByName) Swap(i, j int) {
	b[i], b[j] = b[j], b[i]
}
func (b ByName) Less(i, j int) bool {
	return b[i].Name < b[j].Name
}
func (b ByAge) Len() int {
	return len(b)
}
func (b ByAge) Swap(i, j int) {
	b[i], b[j] = b[j], b[i]
}
func (b ByAge) Less(i, j int) bool {
	return b[i].Age < b[j].Age
}

var  BynamePersons = []Person{}
var  ByagePersons  = []Person{}
func GenerateRandPersons(slicesize int, namesize int) ([]Person, []Person) {
	for i := 0; i < slicesize; i++ {
		// Generate random persons
		BynamePersons = append(BynamePersons, Person{RandStringBytes(namesize), rand.Intn(100)}) //这里调用了生成随机6位字符串的person name, 0-100的person age. 并且append到[]person切片中
		ByagePersons = append(ByagePersons, Person{RandStringBytes(namesize), rand.Intn(100)})
	}
	return BynamePersons, ByagePersons
}
go 复制代码
//$GOPATH/maindir/main.go 
package main
import (
	"fmt"
	"sort"
	"sortinterface"
)

func main() {
	bynamepersons, byagepersons := sortinterface.GenerateRandPersons(10, 6) //生成10个person struct.并且person.Name为6位随机byte
	fmt.Println("Before Sort By Name:", bynamepersons)                      
	sort.Sort(sortinterface.ByName(bynamepersons))                          //以person.Name进行排序
	fmt.Println("After Sort By Name:", bynamepersons)
	fmt.Println("Before Sort By Age:", byagepersons)
	sort.Sort(sortinterface.ByAge(byagepersons))                            //以person.Age进行排序
	fmt.Println("After Sort By Age:", byagepersons)
}

下面看下运行结果:

符合预期.