这是我参与「第五届青训营 」伴学笔记创作活动的第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内部已经按照定义的排序规则排好序了