脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go语言sort包函数使用示例

Go语言sort包函数使用示例

2022-10-13 12:03Notomato Golang

这篇文章主要为大家介绍了Go语言sort包函数使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

sort包简介

官方文档Golang的sort包用来排序,二分查找等操作。本文主要介绍sort包里常用的函数,通过实例代码来快速学会使用sort包

sort包内置函数

sort.Ints(x []int)

?
1
2
3
4
5
6
ints := []int{1, 4, 3, 2}
fmt.Printf("%v\n", ints)
sort.Ints(ints) //默认升序
fmt.Printf("%v\n", ints) //[1 2 3 4]
sort.Sort(sort.Reverse(sort.IntSlice(ints))) //降序排序
fmt.Printf("%v\n", ints) //[4 3 2 1]

sort.Strings(x []string)

sort.Float64s(x []float64)

  • 使用方法同上,都是对内置int string float64类型的便捷排序

sort.Slice(x any, less func(i, j int) bool)

  • 传入对象是切片,要自己实现回调函数
?
1
2
3
4
5
slices := []int{1, 1, 4, 5, 1, 4}
sort.Slice(slices, func(i, j int) bool {
    return slices[i] < slices[j]
})
fmt.Printf("%v\n", slices)//[1 1 1 4 4 5]
  • 同时也可以对结构体自定义排序规则
?
1
2
3
4
5
6
7
8
9
10
11
12
type stu struct {
    name string
    age  int
}
stus := []stu{{"h", 20}, {"a", 23}, {"h", 21}}
sort.Slice(stus, func(i, j int) bool {
    if stus[i].name == stus[j].name {
        return stus[i].age > stus[j].age // 年龄逆序
    }
    return stus[i].name < stus[j].name // 名字正序
})
fmt.Printf("%v\n", stus) //[{a 23} {h 21} {h 20}]

sort.Sort(data Interface)

  • 自定义排序,需要实现 Len() Less() Swap() 三个方法
?
1
2
3
4
5
6
7
8
9
type Interface interface {
    // Len is the number of elements in the collection.
    Len() int
    // Less reports whether the element with
    // index i should sort before the element with index j.
    Less(i, j int) bool
    // Swap swaps the elements with indexes i and j.
    Swap(i, j int)
}
  • 使用代码
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type stu struct {
    name string
    age  int
}
type student []stu
func (s student) Len() int {
    return len(s)
}
func (s student) Less(i, j int) bool {
    if s[i].name == s[j].name {
        return s[i].age > s[j].age // 年龄逆序
    }
    return s[i].name < s[j].name // 名字正序
}
func (s student) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}
func main() {
    stus1 := student{{"h", 20}, {"a", 23}, {"h", 21}}
    sort.Sort(stus1)
    fmt.Printf("%v\n", stus1) //[{a 23} {h 21} {h 20}] 使用效果等同于sort.Slice
}
  • 使用效果等同于sort.Slice后者代码量较少

sort.SearchInts(a []int, x int) int

  • 该函数是用来二分查找的, 默认是在左边插入
?
1
2
3
arr := []int{1, 2, 3, 4, 5, 6, 7}
idx := sort.SearchInts(arr, 4)
fmt.Printf("%v\n", idx) // 3

sort.SearchFloat64s(a []float64, x float64) int

sort.SearchStrings(a []string, x string) int

  • 这两函数功能同上

sort.Search(n int, f func(int) bool) int

  • 自定义的二分查找,回调函数需要自己实现查找条件
?
1
2
3
4
5
arr := []int{1, 2, 3, 4, 5, 6, 7}
idx := sort.Search(len(arr), func(i int) bool {
    return arr[i] > 4
})
fmt.Printf("%v\n", idx) //4
  • 相比SearchInts,通过自定义条件便实现了相等情况下在右边插入,前者默认是在左边
  • 更高级一点的用法
?
1
2
3
4
5
6
7
8
9
10
11
12
mysring := []string{"abcd", "bcde", "bfag", "cddd"}
idx := sort.Search(len(mysring), func(i int) bool {
    // 查找头两位字母不是b的,,返回找到的第一个
    return mysring[i][0] != 'b' && mysring[i][1] != 'b'
})
fmt.Printf("%v\n", mysring[idx]) // cddd
mysring := []string{"abcd", "bcde", "bfag", "cddd"}
idx := sort.Search(len(mysring), func(i int) bool {
    //查找第一个字母不是b的
    return mysring[i][0] <= byte('b')
})
fmt.Printf("%v\n", mysring[idx]) // abcd

以上就是Go语言sort包使用示例的详细内容,更多关于Go语言sort包的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/notomatoes/p/16277688.html

延伸 · 阅读

精彩推荐
  • Golanggolang数组-----寻找数组中缺失的整数方法

    golang数组-----寻找数组中缺失的整数方法

    这篇文章主要介绍了golang数组-----寻找数组中缺失的整数方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    疯狂的鸭血11542021-03-12
  • Golang关于go-zero单体服务使用泛型简化注册Handler路由的问题

    关于go-zero单体服务使用泛型简化注册Handler路由的问题

    这篇文章主要介绍了go-zero单体服务使用泛型简化注册Handler路由,涉及到Golang环境安装及配置Go Module的相关知识,本文给大家介绍的非常详细,对大家的学习...

    修车课代表11792022-07-27
  • Golang解决Go中使用seed得到相同随机数的问题

    解决Go中使用seed得到相同随机数的问题

    这篇文章主要介绍了Go中使用seed得到相同随机数的问题,需要的朋友可以参考下 ...

    detectiveHLH8212020-05-28
  • GolangGo语言中结构体方法副本传参与指针传参的区别介绍

    Go语言中结构体方法副本传参与指针传参的区别介绍

    这篇文章主要给大家介绍了关于Go语言中结构体方法副本传参与指针传参的区别的相关资料,文中先对GO语言结构体方法跟结构体指针方法的区别进行了一些...

    John4922020-05-12
  • Golanggo mod详细使用教程

    go mod详细使用教程

    go mod是go的一个模块管理工具,用来代替传统的GOPATH方案,下面这篇文章主要给大家介绍了关于go mod详细使用的相关资料,文中通过图文以及实例代码介绍的非...

    若与8152022-07-28
  • GolangGo语言的GOPATH与工作目录详解

    Go语言的GOPATH与工作目录详解

    这篇文章主要介绍了Go语言的GOPATH与工作目录详解,本文详细讲解了GOPATH设置、应用目录结构、编译应用等内容,需要的朋友可以参考下 ...

    junjie18042020-04-08
  • GolangGo语言学习之反射的用法详解

    Go语言学习之反射的用法详解

    反射指的是运行时动态的获取变量的相关信息。本文将为大家详细介绍Go语言中反射的用法,文中的示例代码讲解详细,感兴趣的可以了解一下...

    隐姓埋名48695592022-09-26
  • Golanggo各种import的使用方法讲解

    go各种import的使用方法讲解

    今天小编就为大家分享一篇关于go各种import的使用方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来...

    stpeace4492020-05-25