Golang之Sort的用法 | 青训营笔记

50 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第14天

在实现返回评论列表的API中,本来一开始打算用Go routine并发的组装评论信息。但一想会这样组装的评论列表不是按照时间顺序的,因此就用串行的方式返回列表,在后面测试的时候发现随着评论数量增多,评论列表的响应时间变长。

  • 串行的获取评论列表

耗时5s多,响应时间无法忍受。

  • 使用goroutine会快很多

使用goroutine并发会很快,响应时间极大缩短,但是会导致数据乱序,于是乎排序就必不可少,那Golang里面有没有现成的Sort API可以调用呢?接下来就进入本次正题。

正片

首先我们需要引入sort包

对内置数据类型排序

分别使用sort包中的 Ints()、Float64s()、Strings()函数,对数据类型int、float64、string进行排序,默认都是升序

升序

package main

import (
	"fmt"
	"sort"
)

func main() {
    intSlice := []int{3, 1, 2, 5, 4}
    float64Slice := []float64{3.2, 1.0, 2.1, 5.4, 4.3}
    stringSlice := []string{"abcd", "aacd", "bcda", "d"}

    sort.Ints(intSlice)			//1, 2, 3, 4, 5
    sort.Float64s(float64Slice)	//1.0, 2.1, 3.2, 4.3, 5.4
    sort.Strings(stringSlice)	//"aacd", "abcd", "bcda", "d"
}

降序

package main

import (
	"fmt"
	"sort"
)

func main() {
	intSlice := []int{3, 1, 2, 5, 4}
	float64Slice := []float64{3.2, 1.0, 2.1, 5.4, 4.3}
	stringSlice := []string{"abcd", "aacd", "bcda", "d"}

	sort.Sort(sort.Reverse(sort.IntSlice(intSlice)))
	//5, 4, 3, 2, 1
	sort.Sort(sort.Reverse(sort.Float64Slice(float64Slice)))
	//5.4, 4.3, 3.2, 2.1, 1.0
	sort.Sort(sort.Reverse(sort.StringSlice(stringSlice)))
	//"d", "bcda", "abcd", "aacd"
}

一般类型的排序

在程序中我们经常对自定义的数据结构进行排序。一般来说分为三个步骤:

第一步 定义结构体切片

type CommentSlice []Comment

第二步 实现sort.Sort()的三个函数

第一个是返回切片的长度

第二个是设置比较规则

第三个是交换元素

func (commentSlice CommentSlice) Len() int {
	return len(commentSlice)
}

func (commentSlice CommentSlice) Less(i, j int) bool {
	return commentSlice[i].CreateDate > commentSlice[j].CreateDate
}

func (commentSlice CommentSlice) Swap(i, j int) {
	commentSlice[i], commentSlice[j] = commentSlice[j], commentSlice[i]
}

第三步 调用sort.Sort()

// commentInfoList是[]comemnt类型
sort.Sort(CommentSlice(commentInfoList))
// 此时commentInfoList内部已经按照定义的排序规则排好序了